From 5cd9485e98cbaaa958ca9d40a569e3ebbf99bfe6 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Tue, 4 Apr 2023 16:50:57 -0400 Subject: [PATCH 01/73] Allow any type for webAclProps (#943) --- .../aws-wafwebacl-apigateway/lib/index.ts | 2 +- .../integ.partial-arguments.expected.json | 696 ++++++++++++++++++ .../test/integ.partial-arguments.ts | 34 + .../test/test.wafwebacl-apigateway.test.ts | 29 +- .../aws-wafwebacl-appsync/lib/index.ts | 2 +- .../integ.partial-arguments.expected.json | 205 ++++++ .../test/integ.partial-arguments.ts | 38 + .../test/test.wafwebacl-appsync.test.ts | 20 +- .../aws-wafwebacl-cloudfront/lib/index.ts | 2 +- .../integ.partial-arguments.expected.json | 266 +++++++ .../test/integ.partial-arguments.ts | 34 + .../test/test.wafwebacl-cloudfront.test.ts | 30 +- .../core/lib/waf-helper.ts | 2 +- .../core/test/waf-helper.test.ts | 24 +- 14 files changed, 1344 insertions(+), 40 deletions(-) create mode 100644 source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts index a492fc189..e88e360e6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts @@ -36,7 +36,7 @@ export interface WafwebaclToApiGatewayProps { * * @default - Default properties are used. */ - readonly webaclProps?: waf.CfnWebACLProps, + readonly webaclProps?: waf.CfnWebACLProps | any, } /** diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json new file mode 100644 index 000000000..408ac35b8 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json @@ -0,0 +1,696 @@ +{ + "Resources": { + "testFunctionServiceRoleFEC29B6F": { + "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" + ] + ] + } + ] + } + }, + "testFunction483F4CBE": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" + }, + "Role": { + "Fn::GetAtt": [ + "testFunctionServiceRoleFEC29B6F", + "Arn" + ] + }, + "Handler": ".handler", + "Runtime": "nodejs14.x" + }, + "DependsOn": [ + "testFunctionServiceRoleFEC29B6F" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Test Resource" + }, + { + "id": "W89", + "reason": "Test Resource" + }, + { + "id": "W92", + "reason": "Test Resource" + } + ] + } + } + }, + "testApiD6ECAB50": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "Name": "testApi" + } + }, + "testApiCloudWatchRole8A11639C": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "apigateway.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs" + ] + ] + } + ] + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "testApiAccountA6723CBB": { + "Type": "AWS::ApiGateway::Account", + "Properties": { + "CloudWatchRoleArn": { + "Fn::GetAtt": [ + "testApiCloudWatchRole8A11639C", + "Arn" + ] + } + }, + "DependsOn": [ + "testApiD6ECAB50" + ], + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "testApiDeployment3727A0B98616f677c89f00f84016798f65d107c0": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "testApiD6ECAB50" + }, + "Description": "Automatically created by the RestApi construct" + }, + "DependsOn": [ + "testApiproxyANYC53F2608", + "testApiproxyA0E5503A", + "testApiANYDC600770" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W68", + "reason": "Test Resource" + } + ] + } + } + }, + "testApiDeploymentStageprodCE051BE8": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "RestApiId": { + "Ref": "testApiD6ECAB50" + }, + "DeploymentId": { + "Ref": "testApiDeployment3727A0B98616f677c89f00f84016798f65d107c0" + }, + "StageName": "prod" + }, + "DependsOn": [ + "testApiAccountA6723CBB" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W64", + "reason": "Test Resource" + }, + { + "id": "W69", + "reason": "Test Resource" + } + ] + } + } + }, + "testApiproxyA0E5503A": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "testApiD6ECAB50", + "RootResourceId" + ] + }, + "PathPart": "{proxy+}", + "RestApiId": { + "Ref": "testApiD6ECAB50" + } + } + }, + "testApiproxyANYApiPermissionpartialargumentstestApi67E53489ANYproxyD442645B": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "testFunction483F4CBE", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "testApiD6ECAB50" + }, + "/", + { + "Ref": "testApiDeploymentStageprodCE051BE8" + }, + "/*/*" + ] + ] + } + } + }, + "testApiproxyANYApiPermissionTestpartialargumentstestApi67E53489ANYproxyA0A33584": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "testFunction483F4CBE", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "testApiD6ECAB50" + }, + "/test-invoke-stage/*/*" + ] + ] + } + } + }, + "testApiproxyANYC53F2608": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "ANY", + "ResourceId": { + "Ref": "testApiproxyA0E5503A" + }, + "RestApiId": { + "Ref": "testApiD6ECAB50" + }, + "AuthorizationType": "NONE", + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "testFunction483F4CBE", + "Arn" + ] + }, + "/invocations" + ] + ] + } + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W59", + "reason": "Test Resource" + } + ] + } + } + }, + "testApiANYApiPermissionpartialargumentstestApi67E53489ANY0CE0FBBB": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "testFunction483F4CBE", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "testApiD6ECAB50" + }, + "/", + { + "Ref": "testApiDeploymentStageprodCE051BE8" + }, + "/*/" + ] + ] + } + } + }, + "testApiANYApiPermissionTestpartialargumentstestApi67E53489ANYFA990832": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "testFunction483F4CBE", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "testApiD6ECAB50" + }, + "/test-invoke-stage/*/" + ] + ] + } + } + }, + "testApiANYDC600770": { + "Type": "AWS::ApiGateway::Method", + "Properties": { + "HttpMethod": "ANY", + "ResourceId": { + "Fn::GetAtt": [ + "testApiD6ECAB50", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testApiD6ECAB50" + }, + "AuthorizationType": "NONE", + "Integration": { + "IntegrationHttpMethod": "POST", + "Type": "AWS_PROXY", + "Uri": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "testFunction483F4CBE", + "Arn" + ] + }, + "/invocations" + ] + ] + } + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W59", + "reason": "Test Resource" + } + ] + } + } + }, + "testwafwebaclapigatewaylambdatestwafwebaclapigatewaylambdaWebACL9DE6948C": { + "Type": "AWS::WAFv2::WebACL", + "Properties": { + "DefaultAction": { + "Allow": {} + }, + "Scope": "REGIONAL", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + }, + "Name": "test-name-apigateway", + "Rules": [ + { + "Name": "AWS-AWSManagedRulesBotControlRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 0, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesBotControlRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesBotControlRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesKnownBadInputsRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 1, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesKnownBadInputsRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesKnownBadInputsRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesCommonRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 2, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesCommonRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesCommonRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesAnonymousIpList", + "OverrideAction": { + "None": {} + }, + "Priority": 3, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesAnonymousIpList", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesAnonymousIpList", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesAmazonIpReputationList", + "OverrideAction": { + "None": {} + }, + "Priority": 4, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesAmazonIpReputationList", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesAmazonIpReputationList", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesAdminProtectionRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 5, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesAdminProtectionRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesAdminProtectionRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesSQLiRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 6, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesSQLiRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesSQLiRuleSet", + "SampledRequestsEnabled": true + } + } + ] + } + }, + "testwafwebaclapigatewaylambdaWebACLAssociation": { + "Type": "AWS::WAFv2::WebACLAssociation", + "Properties": { + "ResourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + "::/restapis/", + { + "Ref": "testApiD6ECAB50" + }, + "/stages/", + { + "Ref": "testApiDeploymentStageprodCE051BE8" + } + ] + ] + }, + "WebACLArn": { + "Fn::GetAtt": [ + "testwafwebaclapigatewaylambdatestwafwebaclapigatewaylambdaWebACL9DE6948C", + "Arn" + ] + } + } + } + }, + "Outputs": { + "testApiEndpointC9D07ADA": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "testApiD6ECAB50" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "testApiDeploymentStageprodCE051BE8" + }, + "/" + ] + ] + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.ts new file mode 100644 index 000000000..a94a553fb --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.ts @@ -0,0 +1,34 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +/// !cdk-integ * +import { App, Stack } from "aws-cdk-lib"; +import { WafwebaclToApiGateway } from "../lib"; +import { generateIntegStackName } from "@aws-solutions-constructs/core"; +import { CreateTestApi } from './test-helper'; + +const app = new App(); + +// Empty arguments +const stack = new Stack(app, generateIntegStackName(__filename)); + +const restApi = CreateTestApi(stack, 'test'); + +new WafwebaclToApiGateway(stack, "test-wafwebacl-apigateway-lambda", { + existingApiGatewayInterface: restApi, + webaclProps: { + name: 'test-name-apigateway' + } +}); + +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts index d8fce9ae2..cc6da5575 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts @@ -19,7 +19,7 @@ import * as waf from "aws-cdk-lib/aws-wafv2"; import * as defaults from '@aws-solutions-constructs/core'; import { Template } from 'aws-cdk-lib/assertions'; -function deployConstruct(stack: cdk.Stack, constructProps?: waf.CfnWebACLProps) { +function deployConstruct(stack: cdk.Stack, constructProps?: waf.CfnWebACLProps | any) { const restApi = new api.RestApi(stack, 'test-api', {}); restApi.root.addMethod('ANY'); @@ -30,9 +30,6 @@ function deployConstruct(stack: cdk.Stack, constructProps?: waf.CfnWebACLProps) return new WafwebaclToApiGateway(stack, 'test-wafwebacl-apigateway', props); } -// -------------------------------------------------------------- -// Test error handling for existing WAF web ACL and user provided web ACL props -// -------------------------------------------------------------- test('Test error handling for existing WAF web ACL and user provider web ACL props', () => { const stack = new cdk.Stack(); const props: waf.CfnWebACLProps = { @@ -59,9 +56,6 @@ test('Test error handling for existing WAF web ACL and user provider web ACL pro }).toThrowError(); }); -// -------------------------------------------------------------- -// Test default deployment -// -------------------------------------------------------------- test('Test default deployment', () => { const stack = new cdk.Stack(); const construct = deployConstruct(stack); @@ -202,9 +196,6 @@ test('Test default deployment', () => { }); }); -// -------------------------------------------------------------- -// Test web acl with user provided acl props -// -------------------------------------------------------------- test('Test user provided acl props', () => { const stack = new cdk.Stack(); const webaclProps: waf.CfnWebACLProps = { @@ -273,9 +264,21 @@ test('Test user provided acl props', () => { }); }); -// -------------------------------------------------------------- -// Test existing web ACL -// -------------------------------------------------------------- +test('Test user provided partial acl props', () => { + const stack = new cdk.Stack(); + const testName = 'test-name'; + const webaclProps = { + name: testName + }; + + deployConstruct(stack, webaclProps); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::WAFv2::WebACL", { + Name: testName + }); +}); + test('Test existing web ACL', () => { const stack = new cdk.Stack(); const webacl: waf.CfnWebACL = new waf.CfnWebACL(stack, 'test-webacl', { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts index d75d2e01a..4dcf3d035 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts @@ -35,7 +35,7 @@ export interface WafwebaclToAppsyncProps { * * @default - Default properties are used. */ - readonly webaclProps?: waf.CfnWebACLProps; + readonly webaclProps?: waf.CfnWebACLProps | any; } /** diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json new file mode 100644 index 000000000..c7f333c0c --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json @@ -0,0 +1,205 @@ +{ + "Resources": { + "newgraphqlapi": { + "Type": "AWS::AppSync::GraphQLApi", + "Properties": { + "AuthenticationType": "API_KEY", + "Name": "api" + } + }, + "testwafwebaclappsynctestwafwebaclappsyncWebACLA64C38D0": { + "Type": "AWS::WAFv2::WebACL", + "Properties": { + "DefaultAction": { + "Allow": {} + }, + "Scope": "REGIONAL", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + }, + "Name": "test-name-appsync", + "Rules": [ + { + "Name": "AWS-AWSManagedRulesBotControlRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 0, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesBotControlRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesBotControlRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesKnownBadInputsRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 1, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesKnownBadInputsRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesKnownBadInputsRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesCommonRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 2, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesCommonRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesCommonRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesAnonymousIpList", + "OverrideAction": { + "None": {} + }, + "Priority": 3, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesAnonymousIpList", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesAnonymousIpList", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesAmazonIpReputationList", + "OverrideAction": { + "None": {} + }, + "Priority": 4, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesAmazonIpReputationList", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesAmazonIpReputationList", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesAdminProtectionRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 5, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesAdminProtectionRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesAdminProtectionRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesSQLiRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 6, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesSQLiRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesSQLiRuleSet", + "SampledRequestsEnabled": true + } + } + ] + } + }, + "testwafwebaclappsyncWebACLAssociation": { + "Type": "AWS::WAFv2::WebACLAssociation", + "Properties": { + "ResourceArn": { + "Fn::GetAtt": [ + "newgraphqlapi", + "Arn" + ] + }, + "WebACLArn": { + "Fn::GetAtt": [ + "testwafwebaclappsynctestwafwebaclappsyncWebACLA64C38D0", + "Arn" + ] + } + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.ts new file mode 100644 index 000000000..cd8789717 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.ts @@ -0,0 +1,38 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +/// !cdk-integ * +import { App, Stack } from "aws-cdk-lib"; +import { WafwebaclToAppsync } from "../lib"; +import { generateIntegStackName } from "@aws-solutions-constructs/core"; +import * as appsync from "aws-cdk-lib/aws-appsync"; + +const app = new App(); + +// Empty arguments +const stack = new Stack(app, generateIntegStackName(__filename)); + +const api = new appsync.CfnGraphQLApi(stack, "new-graphql-api", { + name: "api", + authenticationType: "API_KEY", +}); + +// This construct can only be attached to a configured Appsync API. +new WafwebaclToAppsync(stack, "test-wafwebacl-appsync", { + existingAppsyncApi: api, + webaclProps: { + name: 'test-name-appsync' + } +}); + +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts index 66150c224..6b13384b6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts @@ -28,7 +28,7 @@ function deployAppsyncGraphqlApi(stack: cdk.Stack) { function deployConstruct( stack: cdk.Stack, - webaclProps?: waf.CfnWebACLProps, + webaclProps?: waf.CfnWebACLProps | any, existingWebaclObj?: waf.CfnWebACL ) { const api = deployAppsyncGraphqlApi(stack); @@ -212,9 +212,6 @@ test("Test default deployment", () => { }); }); -// -------------------------------------------------------------- -// Test web acl with user provided acl props -// -------------------------------------------------------------- test("Test user provided acl props", () => { const stack = new cdk.Stack(); const webaclProps: waf.CfnWebACLProps = { @@ -283,6 +280,21 @@ test("Test user provided acl props", () => { }); }); +test("Test user provided partial acl props", () => { + const stack = new cdk.Stack(); + const testName = 'test-name'; + const webaclProps = { + name: testName + }; + + deployConstruct(stack, webaclProps); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::WAFv2::WebACL", { + Name: testName + }); +}); + // -------------------------------------------------------------- // Test existing web ACL // -------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/lib/index.ts index 1b84a0189..757996dd5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/lib/index.ts @@ -39,7 +39,7 @@ export interface WafwebaclToCloudFrontProps { * * @default - Default properties are used. */ - readonly webaclProps?: waf.CfnWebACLProps, + readonly webaclProps?: waf.CfnWebACLProps | any, } /** diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json new file mode 100644 index 000000000..d90fd31af --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json @@ -0,0 +1,266 @@ +{ + "Resources": { + "distro40218A07": { + "Type": "AWS::CloudFront::Distribution", + "Properties": { + "DistributionConfig": { + "DefaultCacheBehavior": { + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", + "Compress": true, + "TargetOriginId": "partialargumentsdistroOriginGroup13A14546B", + "ViewerProtocolPolicy": "allow-all" + }, + "Enabled": true, + "HttpVersion": "http2", + "IPV6Enabled": true, + "OriginGroups": { + "Items": [ + { + "FailoverCriteria": { + "StatusCodes": { + "Items": [ + 404 + ], + "Quantity": 1 + } + }, + "Id": "partialargumentsdistroOriginGroup13A14546B", + "Members": { + "Items": [ + { + "OriginId": "partialargumentsdistroOrigin1D2A7BC52" + }, + { + "OriginId": "partialargumentsdistroOrigin2689E5A52" + } + ], + "Quantity": 2 + } + } + ], + "Quantity": 1 + }, + "Origins": [ + { + "CustomOriginConfig": { + "OriginProtocolPolicy": "https-only", + "OriginSSLProtocols": [ + "TLSv1.2" + ] + }, + "DomainName": "www.example.com", + "Id": "partialargumentsdistroOrigin1D2A7BC52" + }, + { + "CustomOriginConfig": { + "OriginProtocolPolicy": "https-only", + "OriginSSLProtocols": [ + "TLSv1.2" + ] + }, + "DomainName": "admin.example.com", + "Id": "partialargumentsdistroOrigin2689E5A52" + } + ], + "WebACLId": { + "Fn::GetAtt": [ + "testwafwebaclcloudfronts3testwafwebaclcloudfronts3WebACLC6A34449", + "Arn" + ] + } + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W10", + "reason": "Test Resource" + }, + { + "id": "W70", + "reason": "Test Resource" + } + ] + } + } + }, + "testwafwebaclcloudfronts3testwafwebaclcloudfronts3WebACLC6A34449": { + "Type": "AWS::WAFv2::WebACL", + "Properties": { + "DefaultAction": { + "Allow": {} + }, + "Scope": "CLOUDFRONT", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + }, + "Name": "test-name-cloudfront", + "Rules": [ + { + "Name": "AWS-AWSManagedRulesBotControlRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 0, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesBotControlRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesBotControlRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesKnownBadInputsRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 1, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesKnownBadInputsRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesKnownBadInputsRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesCommonRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 2, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesCommonRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesCommonRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesAnonymousIpList", + "OverrideAction": { + "None": {} + }, + "Priority": 3, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesAnonymousIpList", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesAnonymousIpList", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesAmazonIpReputationList", + "OverrideAction": { + "None": {} + }, + "Priority": 4, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesAmazonIpReputationList", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesAmazonIpReputationList", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesAdminProtectionRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 5, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesAdminProtectionRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesAdminProtectionRuleSet", + "SampledRequestsEnabled": true + } + }, + { + "Name": "AWS-AWSManagedRulesSQLiRuleSet", + "OverrideAction": { + "None": {} + }, + "Priority": 6, + "Statement": { + "ManagedRuleGroupStatement": { + "Name": "AWSManagedRulesSQLiRuleSet", + "VendorName": "AWS" + } + }, + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "AWSManagedRulesSQLiRuleSet", + "SampledRequestsEnabled": true + } + } + ] + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.ts new file mode 100644 index 000000000..20c2c6046 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.ts @@ -0,0 +1,34 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +/// !cdk-integ * +import { App, Stack } from "aws-cdk-lib"; +import { WafwebaclToCloudFront } from "../lib"; +import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { CreateTestDistro } from './test-helper'; + +const app = new App(); + +// Empty arguments +const stack = new Stack(app, generateIntegStackName(__filename)); + +const newDistro = CreateTestDistro(stack, "distro"); + +new WafwebaclToCloudFront(stack, 'test-wafwebacl-cloudfront-s3', { + webaclProps: { + name: 'test-name-cloudfront' + }, + existingCloudFrontWebDistribution: newDistro, +}); + +app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts index c8e7f3bd4..77461d1d4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts @@ -21,7 +21,7 @@ import * as waf from "aws-cdk-lib/aws-wafv2"; import * as defaults from '@aws-solutions-constructs/core'; import { Template } from 'aws-cdk-lib/assertions'; -function deployConstruct(stack: cdk.Stack, constructProps?: waf.CfnWebACLProps) { +function deployConstruct(stack: cdk.Stack, constructProps?: waf.CfnWebACLProps | any) { const myBucket = new s3.Bucket(stack, 'myBucket', { removalPolicy: cdk.RemovalPolicy.DESTROY }); @@ -37,9 +37,6 @@ function deployConstruct(stack: cdk.Stack, constructProps?: waf.CfnWebACLProps) return new WafwebaclToCloudFront(stack, 'test-wafwebacl-cloudfront', props); } -// -------------------------------------------------------------- -// Test error handling for existing WAF web ACL and user provided web ACL props -// -------------------------------------------------------------- test('Test error handling for existing WAF web ACL and user provider web ACL props', () => { const stack = new cdk.Stack(); const props: waf.CfnWebACLProps = { @@ -69,9 +66,6 @@ test('Test error handling for existing WAF web ACL and user provider web ACL pro }).toThrowError(); }); -// -------------------------------------------------------------- -// Test default deployment -// -------------------------------------------------------------- test('Test default deployment', () => { const stack = new cdk.Stack(); const construct = deployConstruct(stack); @@ -212,9 +206,6 @@ test('Test default deployment', () => { }); }); -// -------------------------------------------------------------- -// Test web acl with user provided acl props -// -------------------------------------------------------------- test('Test user provided acl props', () => { const stack = new cdk.Stack(); const webaclProps: waf.CfnWebACLProps = { @@ -283,9 +274,22 @@ test('Test user provided acl props', () => { }); }); -// -------------------------------------------------------------- -// Test existing web ACL -// -------------------------------------------------------------- +test('Test user provided partial acl props', () => { + const stack = new cdk.Stack(); + const testName = 'test-name'; + + const webaclProps = { + name: testName + }; + + deployConstruct(stack, webaclProps); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::WAFv2::WebACL", { + Name: testName + }); +}); + test('Test existing web ACL', () => { const stack = new cdk.Stack(); const webacl: waf.CfnWebACL = new waf.CfnWebACL(stack, 'test-webacl', { diff --git a/source/patterns/@aws-solutions-constructs/core/lib/waf-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/waf-helper.ts index 4e34f1a52..3f4b51c97 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/waf-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/waf-helper.ts @@ -29,7 +29,7 @@ export interface BuildWebaclProps { /** * User provided props to override the default ACL props for WAF web ACL. */ - readonly webaclProps?: waf.CfnWebACLProps; + readonly webaclProps?: waf.CfnWebACLProps | any; } /** diff --git a/source/patterns/@aws-solutions-constructs/core/test/waf-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/waf-helper.test.ts index a99f442fc..d93ba3d19 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/waf-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/waf-helper.test.ts @@ -17,9 +17,6 @@ import * as defaults from '..'; import { Template } from 'aws-cdk-lib/assertions'; import { buildWebacl } from '..'; -// -------------------------------------------------------------- -// Test construct with default props -// -------------------------------------------------------------- test('Test construct with default props', () => { // Stack const stack = new Stack(); @@ -168,9 +165,6 @@ test('Test construct with default props', () => { template.resourceCountIs('AWS::WAFv2::WebACLAssociation', 0); }); -// -------------------------------------------------------------- -// Test deployment w/ user provided custom properties -// -------------------------------------------------------------- test('Test deployment w/ user provided custom properties', () => { // Stack const stack = new Stack(); @@ -244,6 +238,24 @@ test('Test deployment w/ user provided custom properties', () => { }); }); +test('Test deployment w/ user provided partial custom properties', () => { + // Stack + const stack = new Stack(); + const testName = 'test-name'; + // Build WAF web ACL + const props = { + name: testName + }; + + defaults.buildWebacl(stack, 'CLOUDFRONT', { + webaclProps: props + }); + + Template.fromStack(stack).hasResourceProperties("AWS::WAFv2::WebACL", { + Name: testName + }); +}); + // -------------------------------------------------------------- // Test deployment w/ existing WAF web ACL provided // -------------------------------------------------------------- From cace1e4a15d8e19d4052587c8cce20df7b69b484 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 10 Apr 2023 16:44:49 -0400 Subject: [PATCH 02/73] chore(all)): Replace all Node 14 references with Node 16 (#944) * Replace Node 14 w/ Node 16 * Update use cases to node 16 --- CONTRIBUTING.md | 4 +- DEVELOPER_GUIDE.md | 2 +- .../aws-alb-lambda/README.md | 4 +- .../aws-alb-lambda/test/alb-lambda.test.ts | 54 +- ....privateApiExistingResources.expected.json | 2 +- .../test/integ.privateApiExistingResources.ts | 2 +- ...integ.privateApiNewResources.expected.json | 2 +- .../test/integ.privateApiNewResources.ts | 2 +- ...g.publicApiExistingResources.expected.json | 2 +- .../test/integ.publicApiExistingResources.ts | 2 +- .../integ.publicApiNewResources.expected.json | 2 +- .../test/integ.publicApiNewResources.ts | 2 +- .../test/integ.twoTargets.expected.json | 4 +- .../aws-alb-lambda/test/integ.twoTargets.ts | 4 +- .../aws-apigateway-lambda/README.md | 4 +- .../test/integ.deployFunction.expected.json | 2 +- .../test/integ.deployFunction.ts | 2 +- .../test/integ.existingFunction.expected.json | 2 +- .../test/integ.existingFunction.ts | 2 +- .../test/test.apigateway-lambda.test.ts | 8 +- .../README.md | 4 +- ...ustomCloudfrontLoggingBucket.expected.json | 2 +- .../integ.customCloudfrontLoggingBucket.ts | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.no-arguments.ts | 2 +- .../integ.override-behavior.expected.json | 2 +- .../test/integ.override-behavior.ts | 2 +- .../test.cloudfront-apigateway-lambda.test.ts | 14 +- .../aws-cloudfront-apigateway/README.md | 4 +- ...ustomCloudfrontLoggingBucket.expected.json | 2 +- .../integ.customCloudfrontLoggingBucket.ts | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.no-arguments.ts | 2 +- .../test/test.cloudfront-apigateway.test.ts | 4 +- .../aws-cognito-apigateway-lambda/README.md | 8 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.no-arguments.ts | 2 +- .../test.cognito-apigateway-lambda.test.ts | 20 +- .../README.md | 4 +- ...treams-lambda-elasticsearch-kibana.test.ts | 2 +- .../test/integ.deploy-with-vpc.expected.json | 2 +- .../test/integ.deploy-with-vpc.ts | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.no-arguments.ts | 2 +- .../aws-dynamodbstreams-lambda/README.md | 4 +- .../test/dynamodbstreams-lambda.test.ts | 10 +- .../test/integ.existing-table.expected.json | 2 +- .../test/integ.existing-table.ts | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.no-arguments.ts | 2 +- .../aws-eventbridge-lambda/README.md | 4 +- .../test/eventbridge-lambda.test.ts | 10 +- ...ventbridge-existing-eventbus.expected.json | 2 +- .../integ.eventbridge-existing-eventbus.ts | 2 +- ...teg.eventbridge-new-eventbus.expected.json | 2 +- .../test/integ.eventbridge-new-eventbus.ts | 2 +- ...nteg.eventbridge-no-argument.expected.json | 2 +- .../test/integ.eventbridge-no-argument.ts | 2 +- ...pfunctions-existing-eventbus.expected.json | 2 +- ...tbridge-stepfunctions-existing-eventbus.ts | 2 +- ...e-stepfunctions-new-eventbus.expected.json | 2 +- ....eventbridge-stepfunctions-new-eventbus.ts | 2 +- ...ge-stepfunctions-with-lambda.expected.json | 2 +- ...g.eventbridge-stepfunctions-with-lambda.ts | 2 +- .../aws-iot-lambda-dynamodb/README.md | 4 +- .../integ.iot-lambda-dynamodb.expected.json | 2 +- .../test/integ.iot-lambda-dynamodb.ts | 2 +- .../test/integ.with-vpc.expected.json | 2 +- .../test/integ.with-vpc.ts | 2 +- .../test/iot-lambda-dynamodb.test.ts | 22 +- .../aws-iot-lambda/README.md | 4 +- .../integ.iot-lambda-new-func.expected.json | 2 +- .../test/integ.iot-lambda-new-func.ts | 2 +- ...iot-lambda-use-existing-func.expected.json | 2 +- .../integ.iot-lambda-use-existing-func.ts | 2 +- .../aws-iot-lambda/test/iot-lambda.test.ts | 4 +- .../integ.existingStreamObj.expected.json | 2 +- .../test/integ.existingStreamObj.ts | 2 +- .../aws-kinesisstreams-lambda/README.md | 4 +- .../test/integ.existing.expected.json | 2 +- .../test/integ.existing.ts | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.no-arguments.ts | 2 +- .../test/kinesisstreams-lambda.test.ts | 10 +- .../aws-lambda-dynamodb/README.md | 4 +- .../integ.add-secondary-index.expected.json | 2 +- .../test/integ.add-secondary-index.ts | 2 +- ...eployFunctionWithExistingVpc.expected.json | 2 +- .../integ.deployFunctionWithExistingVpc.ts | 2 +- .../integ.deployFunctionWithVpc.expected.json | 2 +- .../test/integ.deployFunctionWithVpc.ts | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.no-arguments.ts | 2 +- .../test/integ.set-billing-mode.expected.json | 2 +- .../test/integ.set-billing-mode.ts | 2 +- .../integ.use-existing-func.expected.json | 2 +- .../test/integ.use-existing-func.ts | 2 +- .../test/lambda-dynamodb.test.ts | 32 +- .../aws-lambda-elasticachememcached/README.md | 4 +- .../integ.existingResources.expected.json | 2 +- .../test/integ.existingResources.ts | 2 +- .../test/integ.newResources.expected.json | 2 +- .../test/integ.newResources.ts | 2 +- .../test/integ.withClientProps.expected.json | 2 +- .../test/integ.withClientProps.ts | 2 +- .../test/lambda-elasticachememcached.test.ts | 28 +- .../aws-lambda-elasticsearch-kibana/README.md | 4 +- ...loyFunctionWithClusterConfig.expected.json | 2 +- .../integ.deployFunctionWithClusterConfig.ts | 2 +- ...eployFunctionWithExistingVpc.expected.json | 2 +- .../integ.deployFunctionWithExistingVpc.ts | 2 +- ...g.deployFunctionWithVpcProps.expected.json | 2 +- .../test/integ.deployFunctionWithVpcProps.ts | 2 +- .../integ.deployToFiveZones.expected.json | 2 +- .../test/integ.deployToFiveZones.ts | 2 +- .../integ.disabledZoneAwareness.expected.json | 2 +- .../test/integ.disabledZoneAwareness.ts | 2 +- .../test/integ.domain-arguments.expected.json | 2 +- .../test/integ.domain-arguments.ts | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.no-arguments.ts | 2 +- .../test/lambda-elasticsearch-kibana.test.ts | 4 +- .../aws-lambda-eventbridge/README.md | 4 +- .../test/aws-lambda-eventbridge.test.ts | 28 +- .../test/integ.deployFunction.expected.json | 2 +- .../test/integ.deployFunction.ts | 2 +- ...eployFunctionWithNewEventBus.expected.json | 2 +- .../integ.deployFunctionWithNewEventBus.ts | 2 +- .../integ.deployFunctionWithVpc.expected.json | 2 +- .../test/integ.deployFunctionWithVpc.ts | 2 +- .../test/integ.existingEventBus.expected.json | 2 +- .../test/integ.existingEventBus.ts | 2 +- .../test/integ.existingFunction.expected.json | 2 +- .../test/integ.existingFunction.ts | 2 +- .../aws-lambda-kinesisfirehose/README.md | 4 +- .../aws-lambda-opensearch/README.md | 4 +- .../test/integ.cluster-config.expected.json | 2 +- .../test/integ.cluster-config.ts | 2 +- ...nteg.disabled-zone-awareness.expected.json | 2 +- .../test/integ.disabled-zone-awareness.ts | 2 +- .../test/integ.domain-arguments.expected.json | 2 +- .../test/integ.domain-arguments.ts | 2 +- .../test/integ.existing-vpc.expected.json | 2 +- .../test/integ.existing-vpc.ts | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.no-arguments.ts | 2 +- .../test/integ.vpc-props.expected.json | 2 +- .../test/integ.vpc-props.ts | 2 +- .../test/lambda-opensearch.test.ts | 6 +- .../aws-lambda-s3/README.md | 4 +- .../integ.customLoggingBucket.expected.json | 2 +- .../test/integ.customLoggingBucket.ts | 2 +- .../test/integ.deployFunction.expected.json | 2 +- .../test/integ.deployFunction.ts | 2 +- .../integ.deployFunctionWithVpc.expected.json | 2 +- .../test/integ.deployFunctionWithVpc.ts | 2 +- .../test/integ.existingFunction.expected.json | 2 +- .../test/integ.existingFunction.ts | 2 +- .../integ.pre-existing-bucket.expected.json | 2 +- .../test/integ.pre-existing-bucket.ts | 2 +- .../aws-lambda-s3/test/lambda-s3.test.ts | 30 +- .../aws-lambda-sagemakerendpoint/README.md | 2 +- .../aws-lambda-secretsmanager/README.md | 4 +- .../test/integ.deployFunction.expected.json | 2 +- .../test/integ.deployFunction.ts | 2 +- ...eployFunctionWithExistingVpc.expected.json | 2 +- .../integ.deployFunctionWithExistingVpc.ts | 2 +- .../integ.deployFunctionWithVpc.expected.json | 2 +- .../test/integ.deployFunctionWithVpc.ts | 2 +- .../test/integ.existingFunction.expected.json | 2 +- .../test/integ.existingFunction.ts | 2 +- .../test/lambda-secretsmanager.test.ts | 26 +- .../aws-lambda-sns/README.md | 4 +- .../test/integ.deployFunction.expected.json | 2 +- .../test/integ.deployFunction.ts | 2 +- .../integ.deployFunctionWithVpc.expected.json | 2 +- .../test/integ.deployFunctionWithVpc.ts | 2 +- .../test/integ.existingFunction.expected.json | 2 +- .../test/integ.existingFunction.ts | 2 +- .../aws-lambda-sns/test/lambda-sns.test.ts | 32 +- .../aws-lambda-sqs-lambda/README.md | 8 +- .../integ.defaultDeployment.expected.json | 4 +- .../test/integ.defaultDeployment.ts | 4 +- ...eployProducerFunctionWithVpc.expected.json | 4 +- .../integ.deployProducerFunctionWithVpc.ts | 4 +- ...teg.existingConsumerFunction.expected.json | 4 +- .../test/integ.existingConsumerFunction.ts | 4 +- ...teg.existingProducerFunction.expected.json | 4 +- .../test/integ.existingProducerFunction.ts | 4 +- .../test/integ.existingQueue.expected.json | 4 +- .../test/integ.existingQueue.ts | 4 +- .../test/lambda-sqs-lambda.test.ts | 60 +- .../aws-lambda-sqs/README.md | 4 +- .../test/integ.deployFunction.expected.json | 2 +- .../test/integ.deployFunction.ts | 2 +- .../integ.deployFunctionWithVpc.expected.json | 2 +- .../test/integ.deployFunctionWithVpc.ts | 2 +- .../test/integ.existingFunction.expected.json | 2 +- .../test/integ.existingFunction.ts | 2 +- .../aws-lambda-sqs/test/lambda-sqs.test.ts | 28 +- .../aws-lambda-ssmstringparameter/README.md | 4 +- .../test/integ.deployFunction.expected.json | 2 +- .../test/integ.deployFunction.ts | 2 +- ...eployFunctionWithExistingVpc.expected.json | 2 +- .../integ.deployFunctionWithExistingVpc.ts | 2 +- .../integ.deployFunctionWithVpc.expected.json | 2 +- .../test/integ.deployFunctionWithVpc.ts | 2 +- .../test/integ.existingFunction.expected.json | 2 +- .../test/integ.existingFunction.ts | 2 +- ...nteg.existingStringParameter.expected.json | 2 +- .../test/integ.existingStringParameter.ts | 2 +- .../test/lambda-ssmstringparameter.test.ts | 24 +- .../aws-lambda-stepfunctions/README.md | 4 +- .../test/integ.deploy-lambda.expected.json | 2 +- .../test/integ.deploy-lambda.ts | 2 +- .../integ.deployFunctionWithVpc.expected.json | 2 +- .../test/integ.deployFunctionWithVpc.ts | 2 +- .../integ.existing-function.expected.json | 2 +- .../test/integ.existing-function.ts | 2 +- .../test/lambda-stepfunctions.test.ts | 26 +- .../aws-s3-lambda/README.md | 4 +- .../integ.existing-s3-bucket.expected.json | 2 +- .../test/integ.existing-s3-bucket.ts | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../aws-s3-lambda/test/integ.no-arguments.ts | 2 +- .../aws-s3-lambda/test/s3-lambda.test.ts | 8 +- .../aws-sns-lambda/README.md | 4 +- .../test/integ.no-arguments.expected.json | 2 +- .../aws-sns-lambda/test/integ.no-arguments.ts | 2 +- .../aws-sns-lambda/test/sns-lambda.test.ts | 16 +- .../aws-sqs-lambda/README.md | 4 +- .../test/integ.deployFifoQueue.expected.json | 2 +- .../test/integ.deployFifoQueue.ts | 2 +- .../test/integ.deployFunction.expected.json | 2 +- .../test/integ.deployFunction.ts | 2 +- .../test/integ.existingFunction.expected.json | 2 +- .../test/integ.existingFunction.ts | 2 +- .../test/test.sqs-lambda.test.ts | 16 +- .../aws-wafwebacl-apigateway/README.md | 4 +- ...ing-waf-to-multiple-gateways.expected.json | 4 +- .../test/integ.no-arguments.expected.json | 2 +- .../integ.partial-arguments.expected.json | 2 +- .../test/test-helper.ts | 2 +- .../core/lib/lambda-helper.ts | 6 +- .../core/test/alb-helper.test.ts | 2 +- .../core/test/apigateway-helper.test.ts | 14 +- ...nt-distribution-api-gateway-helper.test.ts | 6 +- .../cloudfront-distribution-s3-helper.test.ts | 2 +- .../core/test/input-validation.test.ts | 4 +- .../core/test/lambda-helper.test.ts | 40 +- .../lib/kitchen-staff-stack.ts | 4 +- .../lib/manager-stack.ts | 14 +- .../lib/service-staff-stack.ts | 4 +- .../lib/shared-stack.ts | 2 +- .../kitchenStaffStack.test.js.snap | 12 +- .../kitchenStaffStack.test.ts.snap | 4 +- .../__snapshots__/managerStack.test.js.snap | 2949 ----------------- .../__snapshots__/managerStack.test.ts.snap | 2654 --------------- .../serviceStaffStack.test.js.snap | 12 +- .../serviceStaffStack.test.ts.snap | 4 +- .../__snapshots__/sharedStack.test.js.snap | 4 +- .../test/integ.basic-deployment.expected.json | 4 +- .../test/managerStack.test.ts | 34 - .../s3-static-site-stack.test.js.snap | 4 +- .../test/integ.basic-deployment.expected.json | 2 +- 265 files changed, 594 insertions(+), 6235 deletions(-) delete mode 100644 source/use_cases/aws-restaurant-management-demo/test/__snapshots__/managerStack.test.js.snap delete mode 100644 source/use_cases/aws-restaurant-management-demo/test/__snapshots__/managerStack.test.ts.snap delete mode 100644 source/use_cases/aws-restaurant-management-demo/test/managerStack.test.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 89d40167b..09f16ad94 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -208,7 +208,7 @@ Additional scripts that take part in the versioning mechanism: ```console $ cd -$ docker run -u root --rm --net=host -it -v $PWD:$PWD -w $PWD jsii/superchain:1-buster-slim-node14 +$ docker run -u root --rm --net=host -it -v $PWD:$PWD -w $PWD jsii/superchain:1-buster-slim-node16 # The build-patterns.sh command can take along time, be sure to allocate enough resources in the Docker dashboard # (6 CPUs is good) docker$ ./deployment/v2/build-patterns.sh @@ -224,7 +224,7 @@ build and test individual constructs by following the steps below. ```console $ cd -$ docker run -u root --rm --net=host -it -v $PWD:$PWD -w $PWD jsii/superchain:1-buster-slim-node14 +$ docker run -u root --rm --net=host -it -v $PWD:$PWD -w $PWD jsii/superchain:1-buster-slim-node16 docker$ source ./deployment/v2/allow-partial-builds.sh docker$ cd my-module docker$ npm run build+lint+test diff --git a/DEVELOPER_GUIDE.md b/DEVELOPER_GUIDE.md index e599ad93d..57b8e47a9 100644 --- a/DEVELOPER_GUIDE.md +++ b/DEVELOPER_GUIDE.md @@ -17,7 +17,7 @@ Disk image size: 60 GB | Using the Fork button at the upper right, Fork the repo into your github account. | While we can give some advice on what github and git commands to use, we will not attempt to be a git tutorial. Some git/github expertise is assumed.| | Clone forked repo to your local development environment | If you wish to work off a branch in your repository, create that branch now and clone that branch. You will create a PR back to Main in aws-solutions-constructs eventually, you can do that from fork/main or fork/*branch* | | `cd aws-solutions-constructs` | This is the home directory of the repo, this is where you will open your text editor, run full builds, etc.| -| `docker run -u root --rm --net=host -it -v $PWD:$PWD -w $PWD jsii/superchain:1-buster-slim-node14` | This command downloads the Docker image (if necessary) and starts the container in which you will do all builds. The container will stay open in terminal mode, allowing you to edit/build repeatedly until your code is ready.| +| `docker run -u root --rm --net=host -it -v $PWD:$PWD -w $PWD jsii/superchain:1-buster-slim-node16` | This command downloads the Docker image (if necessary) and starts the container in which you will do all builds. The container will stay open in terminal mode, allowing you to edit/build repeatedly until your code is ready.| | Optional - Open a second terminal window to the aws-solutions-constructs directory. | The docker container mounts your local drive, so shares the Solutions Constructs source code tree with the host. You may find it advantageous to maintain a second terminal not running the Docker container to run git commands, your text editor, etc. | | `./deployment/v2/build-patterns.sh` | This command will build the entire repo, which is required prior to developing constructs. Some of the steps include: Installing the correct version of tools required in the build process, setting up environment variables, running JSII in each construct, and running all integration and unit tests. Commands executed across each construct are managed via yarn, so multiple commands are running in parallel most of the time. It's because of this that adding more resources to your Docker container can greatly reduce the build time (suggested values are discussed above). | | In the top level aws-solutions-constructs folder: `./deployment/v2/align-version.sh revert` | This will reset all the version numbers back to 0.0.0. You need to do this before adding/committing code - you can't submit package.json files with version numbers. It's common to do a full build ./deployment/v2/build-patterns.sh after coding to ensure all tests still pass - if you do this it will revert all the version numbers for you.| diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md index ae473a0ec..b5adac68b 100755 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md @@ -45,7 +45,7 @@ const certificate = acm.Certificate.fromCertificateArn( const constructProps: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -121,7 +121,7 @@ ListenerCertificate listenerCertificate = ListenerCertificate // .build()); new AlbToLambda(this, "AlbToLambdaPattern", new AlbToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts index 17273feeb..6e8f60539 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts @@ -26,7 +26,7 @@ test('Test new load balancer and new lambda function', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -86,7 +86,7 @@ test('Test new load balancer and new lambda function for HTTP api', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -135,7 +135,7 @@ test('Test existing load balancer and new lambda function', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -180,7 +180,7 @@ test('Test new load balancer and existing lambda function', () => { const lambdaFunction = new lambda.Function(stack, 'existing-function', { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', functionName: testFunctionName, vpc: testExistingVpc @@ -237,7 +237,7 @@ test("Test existing load balancer and existing lambda function", () => { const lambdaFunction = new lambda.Function(stack, "existing-function", { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", functionName: testFunctionName, vpc: testExistingVpc, @@ -291,7 +291,7 @@ test('Test new load balancer and new lambda function', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', functionName: testFunctionName, }, @@ -338,7 +338,7 @@ test('Test HTTPS adding 2 lambda targets, second with rules', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -351,7 +351,7 @@ test('Test HTTPS adding 2 lambda targets, second with rules', () => { const secondProps: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, ruleProps: { @@ -408,7 +408,7 @@ test('Test HTTP adding 2 lambda targets, second with rules', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -421,7 +421,7 @@ test('Test HTTP adding 2 lambda targets, second with rules', () => { const secondProps: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, ruleProps: { @@ -478,7 +478,7 @@ test('Test new load balancer and new lambda function', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -521,7 +521,7 @@ test('Test logging turned off', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -548,7 +548,7 @@ test('Check Properties', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -573,7 +573,7 @@ test('Test custom ALB properties', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -617,7 +617,7 @@ test('Test custom logging bucket', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -664,7 +664,7 @@ test('Test providing certificateArns is an error', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -692,7 +692,7 @@ test('Test logging off with logBucketProperties provided is an error', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -721,7 +721,7 @@ test('Test certificate with HTTP is an error', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -744,7 +744,7 @@ test('Test new ALB with no listenerProps is an error', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, publicApi: true @@ -772,7 +772,7 @@ test('Test existing ALB with no listener with no listenerProps is an error', () const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, existingLoadBalancerObj: existingAlb, @@ -794,7 +794,7 @@ test('Test existing ALB with a listener with listenerProps is an error', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -807,7 +807,7 @@ test('Test existing ALB with a listener with listenerProps is an error', () => { const secondProps: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, ruleProps: { @@ -837,7 +837,7 @@ test('Test second target with no rules is an error', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -850,7 +850,7 @@ test('Test second target with no rules is an error', () => { const secondProps: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, existingVpc: firstConstruct.vpc, @@ -872,7 +872,7 @@ test('Test no cert for an HTTPS listener is an error', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -901,7 +901,7 @@ test('Test existingLoadBalancerObj and loadBalancerProps is an error', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -936,7 +936,7 @@ test('Test existingLoadBalancerObj and no existingVpc is an error', () => { const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json index ed0323e3f..c875911da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json @@ -819,7 +819,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts index caf34c76e..c7a6e43bb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts @@ -37,7 +37,7 @@ const testSg = new SecurityGroup(stack, 'lambda-sg', { vpc: myVpc, allowAllOutbo const lambdaFunction = defaults.buildLambdaFunction(stack, { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', vpc: myVpc, securityGroups: [ testSg ] diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json index 0d2851787..99f490039 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json @@ -484,7 +484,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.ts index 4d5afe122..e12327aca 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.ts @@ -33,7 +33,7 @@ stack.templateOptions.description = 'Integration Test for HTTP API with a new fu const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json index f6e864ee1..fb4370078 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json @@ -819,7 +819,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts index b7ab1d2aa..d61bb786e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts @@ -41,7 +41,7 @@ const testSg = new SecurityGroup(stack, "lambda-sg", { const lambdaFunction = defaults.buildLambdaFunction(stack, { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", vpc: myVpc, securityGroups: [testSg], diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json index 644b41507..9ffa833a3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json @@ -490,7 +490,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.ts index 93986ce12..dd5b49eb8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.ts @@ -33,7 +33,7 @@ stack.templateOptions.description = 'Integration Test for public HTTP API with a const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json index 8e0173e19..0b975d879 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json @@ -490,7 +490,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, @@ -1539,7 +1539,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.ts index ad3b63f09..362b8d240 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.ts @@ -34,7 +34,7 @@ stack.templateOptions.description = 'Integration test for alb with 2 Lambda targ const props: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, listenerProps: { @@ -51,7 +51,7 @@ const firstConstruct = new AlbToLambda(stack, 'test-one', props); const secondProps: AlbToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, ruleProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/README.md index f490c1f19..e7e2e4760 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/README.md @@ -33,7 +33,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new ApiGatewayToLambda(this, 'ApiGatewayToLambdaPattern', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -71,7 +71,7 @@ import software.amazon.awsconstructs.services.apigatewaylambda.*; new ApiGatewayToLambda(this, "ApiGatewayToLambdaPattern", new ApiGatewayToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json index 96e0c40ec..6418ca233 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json @@ -111,7 +111,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.ts index e13791164..9b2c59e27 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-apigateway-lambda' // Definitions const props: ApiGatewayToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json index 786c85e51..ca87bbb51 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json @@ -111,7 +111,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.ts index a4612a3b8..629413dc6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-apigateway-lambda' // Lambda function setup const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts index 2072df245..bb97187d7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts @@ -42,7 +42,7 @@ test('Test with lambdaFunctionProps', () => { const stack = new Stack(); const props: ApiGatewayToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -74,7 +74,7 @@ test('Test properties', () => { const stack = new Stack(); const props: ApiGatewayToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } @@ -117,7 +117,7 @@ test('Test deployment ApiGateway AuthorizationType override', () => { } }, lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } @@ -142,7 +142,7 @@ test('Test deployment ApiGateway override cloudWatchRole = false', () => { cloudWatchRole: false }, lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/README.md index 3d5e99f7c..3787c1b9e 100755 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/README.md @@ -33,7 +33,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new CloudFrontToApiGatewayToLambda(this, 'test-cloudfront-apigateway-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' } }); @@ -70,7 +70,7 @@ import software.amazon.awsconstructs.services.cloudfrontapigatewaylambda.*; new CloudFrontToApiGatewayToLambda(this, "test-cloudfront-apigateway-lambda", new CloudFrontToApiGatewayToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json index 402e24128..a37d75a11 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json @@ -111,7 +111,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.ts index 7ec47ab8e..e091ed1a2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.ts @@ -26,7 +26,7 @@ stack.templateOptions.description = 'Integration Test for aws-cloudfront-apigate new CloudFrontToApiGatewayToLambda(stack, 'cf-apigw-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, cloudFrontLoggingBucketProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json index 2b325a75d..9a02cb007 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json @@ -111,7 +111,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.ts index eed52a636..88875587d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.ts @@ -24,7 +24,7 @@ stack.templateOptions.description = 'Integration Test for aws-cloudfront-apigate const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json index c6eab3aae..b636fe56f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json @@ -159,7 +159,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts index e57a23d5e..4899f519d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts @@ -29,7 +29,7 @@ stack.templateOptions.description = 'Integration Test for aws-cloudfront-apigate const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts index 9d26e139b..975fe8fb5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts @@ -21,7 +21,7 @@ import { Template } from 'aws-cdk-lib/assertions'; function deployNewFunc(stack: cdk.Stack) { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -32,7 +32,7 @@ function deployNewFunc(stack: cdk.Stack) { function useExistingFunc(stack: cdk.Stack) { const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -70,7 +70,7 @@ test('check lambda function properties for deploy: true', () => { "Arn" ] }, - Runtime: "nodejs14.x", + Runtime: "nodejs16.x", Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1" @@ -146,7 +146,7 @@ test('override api gateway properties with existingLambdaObj', () => { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -178,7 +178,7 @@ test('override api gateway properties without existingLambdaObj', () => { new CloudFrontToApiGatewayToLambda(stack, 'test-cloudfront-apigateway-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, apiGatewayProps: { @@ -211,7 +211,7 @@ test('Cloudfront logging bucket with destroy removal policy and auto delete obje new CloudFrontToApiGatewayToLambda(stack, 'test-cloudfront-apigateway-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, apiGatewayProps: { @@ -253,7 +253,7 @@ test('Cloudfront logging bucket error when providing existing log bucket and log const app = () => { new CloudFrontToApiGatewayToLambda(stack, 'cloudfront-s3', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, apiGatewayProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/README.md b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/README.md index 298504097..b813f9138 100755 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/README.md @@ -33,7 +33,7 @@ import * as api from 'aws-cdk-lib/aws-apigateway'; const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -99,7 +99,7 @@ import software.amazon.awscdk.services.apigateway.*; import software.amazon.awsconstructs.services.cloudfrontapigateway.*; final Function lambdaFunction = Function.Builder.create(this, "IndexHandler") - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build(); diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json index 78693292f..8bdb9fdbc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json @@ -111,7 +111,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.ts index 7acca56f6..9c31a9136 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.ts @@ -27,7 +27,7 @@ stack.templateOptions.description = 'Integration Test for aws-cloudfront-apigate const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json index 21be3559c..77291c962 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json @@ -111,7 +111,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.ts index 4ec959b9d..615e14c0c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.ts @@ -26,7 +26,7 @@ stack.templateOptions.description = 'Integration Test for aws-cloudfront-apigate const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts index f9f0e6172..99492e6f4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts @@ -22,7 +22,7 @@ function deploy(stack: cdk.Stack) { const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -167,7 +167,7 @@ function createApi() { const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/README.md index d42abcbb0..5474d7011 100755 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/README.md @@ -37,7 +37,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new CognitoToApiGatewayToLambda(this, 'test-cognito-apigateway-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' } }); @@ -75,7 +75,7 @@ import software.amazon.awsconstructs.services.cognitoapigatewaylambda.*; new CognitoToApiGatewayToLambda(this, "test-cognito-apigateway-lambda", new CognitoToApiGatewayToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) @@ -94,7 +94,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; const construct = new CognitoToApiGatewayToLambda(this, 'test-cognito-apigateway-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, apiGatewayProps: { @@ -163,7 +163,7 @@ final CognitoToApiGatewayToLambda construct = new CognitoToApiGatewayToLambda(th "test-cognito-apigateway-lambda", new CognitoToApiGatewayToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json index c5cd10081..d66815d6e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json @@ -110,7 +110,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.ts index 22ae720c5..9bbe60f7f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.ts @@ -24,7 +24,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts index 37ccb1753..0c9055654 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts @@ -21,7 +21,7 @@ import { Template } from "aws-cdk-lib/assertions"; function deployNewFunc(stack: cdk.Stack) { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -35,7 +35,7 @@ test('override cognito properties', () => { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -103,7 +103,7 @@ test('override cognito cognitoUserPoolClientProps', () => { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -132,7 +132,7 @@ test('Check for default Cognito Auth Type', () => { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -171,7 +171,7 @@ test('override Auth Type to COGNITO', () => { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -215,7 +215,7 @@ test('Try to override Auth Type to NONE', () => { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -259,7 +259,7 @@ test('Override apiGatewayProps', () => { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -305,7 +305,7 @@ test('Override apiGatewayProps to support CORS', () => { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -371,7 +371,7 @@ test('Override apiGatewayProps with proxy = false and add POST method', () => { const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -410,7 +410,7 @@ test('Override apiGatewayProps with proxy = false and add OPTIONS method', () => const lambdaFunctionProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/README.md b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/README.md index 4ac4e07d8..b23bd82eb 100755 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/README.md @@ -44,7 +44,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; const constructProps: DynamoDBStreamsToLambdaToElasticSearchAndKibanaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, domainName: 'test-domain', @@ -91,7 +91,7 @@ import software.amazon.awsconstructs.services.dynamodbstreamslambdaelasticsearch new DynamoDBStreamsToLambdaToElasticSearchAndKibana(this, "test-dynamodb-stream-lambda-elasticsearch-kibana", new DynamoDBStreamsToLambdaToElasticSearchAndKibanaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts index 4477ae555..5ebf9de4e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts @@ -30,7 +30,7 @@ function deployNewFunc(stack: cdk.Stack) { function getDefaultTestLambdaProps(): lambda.FunctionProps { return { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; } diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json index 633ac7fb6..9164afb23 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json @@ -190,7 +190,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.ts index 3b9ebc819..7cd4f1bac 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.ts @@ -25,7 +25,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: DynamoDBStreamsToLambdaToElasticSearchAndKibanaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, domainName: 'domaintest-7c94db', diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json index 925cb2b0b..59a8b7d35 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json @@ -149,7 +149,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.ts index 3c149144d..490aaba9f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.ts @@ -25,7 +25,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: DynamoDBStreamsToLambdaToElasticSearchAndKibanaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, domainName: 'domaintest-7c94db', diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/README.md index b56372d8e..3bad7b623 100755 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/README.md @@ -37,7 +37,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new DynamoDBStreamsToLambda(this, 'test-dynamodbstreams-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }); @@ -74,7 +74,7 @@ import software.amazon.awsconstructs.services.dynamodbstreamslambda.*; new DynamoDBStreamsToLambda(this, "test-dynamodbstreams-lambda", new DynamoDBStreamsToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/dynamodbstreams-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/dynamodbstreams-lambda.test.ts index 4fd4faf40..35f54094e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/dynamodbstreams-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/dynamodbstreams-lambda.test.ts @@ -21,7 +21,7 @@ function deployNewFunc(stack: cdk.Stack) { const props: DynamoDBStreamsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }; @@ -57,7 +57,7 @@ test('check DynamoEventSourceProps override', () => { const props: DynamoDBStreamsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, dynamoEventSourceProps: { @@ -144,7 +144,7 @@ test('check dynamodb table stream override', () => { const props: DynamoDBStreamsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, dynamoTableProps: { @@ -206,7 +206,7 @@ test('check getter methods with existingTableInterface', () => { }), lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }); @@ -237,7 +237,7 @@ test('check dynamodb table stream override with ITable', () => { const props: DynamoDBStreamsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, existingTableInterface diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.expected.json index 93af8872f..b89b0b08d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.expected.json @@ -172,7 +172,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.ts index 7df3e2b3a..668c86760 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.ts @@ -36,7 +36,7 @@ const table = new dynamodb.Table(stack, 'mytable', { const props: DynamoDBStreamsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, existingTableInterface: table diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.expected.json index 78943da4e..ae6f93c0d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.expected.json @@ -143,7 +143,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.ts index e7d8253b7..5b5121352 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.ts @@ -25,7 +25,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: DynamoDBStreamsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, dynamoEventSourceProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/README.md index b742fcdf6..478f2cc1d 100755 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/README.md @@ -34,7 +34,7 @@ import * as events from 'aws-cdk-lib/aws-events'; const constructProps: EventbridgeToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, eventRuleProps: { @@ -83,7 +83,7 @@ import software.amazon.awsconstructs.services.eventbridgelambda.*; new EventbridgeToLambda(this, "test-eventbridge-lambda", new EventbridgeToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts index c26c09127..b57b2c0a0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts @@ -21,7 +21,7 @@ function deployNewFunc(stack: cdk.Stack) { const props: EventbridgeToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, eventRuleProps: { @@ -36,7 +36,7 @@ function deployNewEventBus(stack: cdk.Stack) { const props: EventbridgeToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, eventBusProps: { eventBusName: 'test' }, @@ -63,7 +63,7 @@ test('check lambda function properties for deploy: true', () => { "Arn" ] }, - Runtime: "nodejs14.x", + Runtime: "nodejs16.x", Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1" @@ -223,7 +223,7 @@ test('check exception while passing existingEventBus & eventBusProps', () => { const props: EventbridgeToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, eventRuleProps: { @@ -247,7 +247,7 @@ test('check custom event bus resource with props when deploy:true', () => { const props: EventbridgeToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, eventBusProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json index c3e762fdb..4117f3456 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json @@ -116,7 +116,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts index 146e505f5..6289de86e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts @@ -26,7 +26,7 @@ const existingEventBus = new events.EventBus(stack, `existing-event-bus`, { eve const props: EventbridgeToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, existingEventBusInterface: existingEventBus, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json index 6a9a6027b..bdf10e99d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json @@ -110,7 +110,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts index 981c68286..f1af26381 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: EventbridgeToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, eventBusProps: { eventBusName: 'test' }, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json index 0b849607a..42bbbcb11 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json @@ -110,7 +110,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.ts index d8c2b6e45..7f31e252d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.ts @@ -25,7 +25,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: EventbridgeToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, eventRuleProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json index bfbfb3c3f..6bcf0a409 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json @@ -110,7 +110,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts index f3a66a610..b71b9f83a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts @@ -26,7 +26,7 @@ const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); const submitLambda = deployLambdaFunction(stack, { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda`), handler: 'index.handler' }); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json index 48269ef73..f1e000cdf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json @@ -110,7 +110,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts index 05c23d75c..275fc178f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts @@ -25,7 +25,7 @@ const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); const submitLambda = deployLambdaFunction(stack, { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda`), handler: 'index.handler' }); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json index 1575bb1b5..b97edd5c9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json @@ -110,7 +110,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.ts index e71a200a4..3cd9c28b1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.ts @@ -26,7 +26,7 @@ const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); const submitLambda = deployLambdaFunction(stack, { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda`), handler: 'index.handler' }); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/README.md b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/README.md index d394d8135..7c988d6d3 100755 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/README.md @@ -37,7 +37,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; const constructProps: IotToLambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, iotTopicRuleProps: { @@ -94,7 +94,7 @@ import software.amazon.awsconstructs.services.iotlambdadynamodb.*; new IotToLambdaToDynamoDB(this, "test-iot-lambda-dynamodb-stack", new IotToLambdaToDynamoDBProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json index cd978c2a2..c0e6aca1f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json @@ -141,7 +141,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.ts index db604206a..4a02c5683 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: IotToLambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, iotTopicRuleProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json index b27565283..acab0fcdd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json @@ -182,7 +182,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.ts index 0bf8cd067..0c70e1045 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: IotToLambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, iotTopicRuleProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts index 2d54ffc9c..5a2aca4f6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts @@ -21,7 +21,7 @@ function deployStack(stack: cdk.Stack) { const props: IotToLambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, iotTopicRuleProps: { @@ -51,7 +51,7 @@ test('check lambda function properties', () => { "Arn" ] }, - Runtime: "nodejs14.x", + Runtime: "nodejs16.x", Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1", @@ -260,7 +260,7 @@ test('check properties', () => { deployVpc: true, lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, iotTopicRuleProps: { @@ -308,7 +308,7 @@ test('Check incorrect table permission', () => { const props: IotToLambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, iotTopicRuleProps: { @@ -335,7 +335,7 @@ test('check lambda function custom environment variable', () => { const props: IotToLambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, tableEnvironmentVariableName: 'CUSTOM_DYNAMODB_TABLE', @@ -354,7 +354,7 @@ test('check lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -375,7 +375,7 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new IotToLambdaToDynamoDB(stack, "lambda-to-dynamodb-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -434,7 +434,7 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new IotToLambdaToDynamoDB(stack, "lambda-to-dynamodb-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -502,7 +502,7 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new IotToLambdaToDynamoDB(stack, "lambda-to-dynamodb-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -555,7 +555,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const stack = new cdk.Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lambda', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -597,7 +597,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new IotToLambdaToDynamoDB(stack, "lambda-to-dynamodb-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/README.md index bd555dd81..a56988567 100755 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/README.md @@ -37,7 +37,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; const constructProps: IotToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, iotTopicRuleProps: { @@ -94,7 +94,7 @@ import software.amazon.awsconstructs.services.iotlambda.*; new IotToLambda(this, "test-iot-lambda-integration", new IotToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json index 78c28c11f..42fd24970 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json @@ -110,7 +110,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.ts index fb2548934..f9bfa0aac 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: IotToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, iotTopicRuleProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json index a7dc17f2e..9026e8587 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json @@ -110,7 +110,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.ts index f7736d09f..aebc3dabc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.ts @@ -23,7 +23,7 @@ const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts index 1b80787e3..2752a632e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts @@ -20,7 +20,7 @@ function deployNewFunc(stack: cdk.Stack) { const props: IotToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, iotTopicRuleProps: { @@ -73,7 +73,7 @@ test('check lambda function properties for deploy: true', () => { "Arn" ] }, - Runtime: "nodejs14.x" + Runtime: "nodejs16.x" }); }); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json index e5fe58b7d..d533ff8b8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json @@ -168,7 +168,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.ts index 7d1fd3988..36dfacbd3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.ts @@ -27,7 +27,7 @@ stack.templateOptions.description = 'Integration Test for aws-kinesisstreams-kin const construct = new KinesisStreamsToLambda(stack, 'test-kinesis-lambda', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/README.md index 33e419abf..1f2b63a03 100755 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/README.md @@ -36,7 +36,7 @@ new KinesisStreamsToLambda(this, 'KinesisToLambdaPattern', { batchSize: 1 }, lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -86,7 +86,7 @@ new KinesisStreamsToLambda(this, "KinesisToLambdaPattern", new KinesisStreamsToL .batchSize(1) .build()) .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json index 9b6cdaf63..54790562d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json @@ -131,7 +131,7 @@ ] }, "Handler": "index.handler", - "Runtime": "nodejs14.x" + "Runtime": "nodejs16.x" }, "DependsOn": [ "testroleDefaultPolicy884631E2", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.ts index 2c89ce788..0cf1118b1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.ts @@ -41,7 +41,7 @@ const lambdaRole = new iam.Role(stack, 'test-role', { }); const lambdaFn = new lambda.Function(stack, 'test-fn', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), role: lambdaRole, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json index dcee630d0..e706fe3a2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json @@ -168,7 +168,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.ts index 1ed41ea7d..486aa0f9e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-kinesisstreams-lam // Definitions const props: KinesisStreamsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts index 8201f099d..5392f5a4c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts @@ -26,7 +26,7 @@ test('Test properties', () => { const stack = new Stack(); const props: KinesisStreamsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } @@ -48,7 +48,7 @@ test('Test existing resources', () => { const stack = new Stack(); const fn = new lambda.Function(stack, 'test-fn', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }); @@ -75,7 +75,7 @@ test('Test existing resources', () => { template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', }); }); @@ -86,7 +86,7 @@ test('test sqsDlqQueueProps override', () => { const stack = new Stack(); const props: KinesisStreamsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -112,7 +112,7 @@ test('Test properties with no CW Alarms', () => { const stack = new Stack(); const props: KinesisStreamsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/README.md index cf11216b5..e6713cc03 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/README.md @@ -33,7 +33,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; const constructProps: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }; @@ -71,7 +71,7 @@ import software.amazon.awsconstructs.services.lambdadynamodb.*; new LambdaToDynamoDB(this, "test_lambda_dynamodb_stack", new LambdaToDynamoDBProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json index 75ab879b1..7c73a959d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json @@ -152,7 +152,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.ts index af29a1aa0..550fda6f5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.ts @@ -26,7 +26,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const construct: LambdaToDynamoDB = new LambdaToDynamoDB(stack, 'test-lambda-dynamodb-stack', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json index cfb86317f..53d92cbb8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json @@ -893,7 +893,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.ts index fc3061108..cf0f75cc9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.ts @@ -36,7 +36,7 @@ defaults.AddAwsServiceEndpoint(stack, vpc, defaults.ServiceEndpointTypes.DYNAMOD // Definitions const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json index 68914f798..05c3865e6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json @@ -183,7 +183,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.ts index 5cd2a3d02..121a0ffcd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = "Integration Test for aws-lambda-dynamodb"; // Definitions const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json index b5cca957d..c65bb799c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json @@ -141,7 +141,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.ts index 24c0a83a7..303ff495d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.ts @@ -25,7 +25,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json index 36d02c75c..a6ec259c1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json @@ -141,7 +141,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.ts index e67d16cfd..6ec64dd0b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.ts @@ -35,7 +35,7 @@ new LambdaToDynamoDB(stack, 'test-lambda-dynamodb-stack', { }, lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' } }); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json index 89489ab00..fb888101b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json @@ -141,7 +141,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.ts index ed5ec305c..d8eeed504 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.ts @@ -21,7 +21,7 @@ import { generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts index f796609c8..1b586b259 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts @@ -22,7 +22,7 @@ function deployNewFunc(stack: cdk.Stack) { const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }; @@ -67,7 +67,7 @@ test('check lambda function properties for deploy: true', () => { "Arn" ] }, - Runtime: "nodejs14.x", + Runtime: "nodejs16.x", Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1", @@ -298,7 +298,7 @@ test('check for no prop', () => { const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' } }; @@ -313,7 +313,7 @@ test('check for no prop', () => { "Arn" ] }, - Runtime: "nodejs14.x", + Runtime: "nodejs16.x", Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1", @@ -331,7 +331,7 @@ test('check lambda function policy ReadOnly table permissions', () => { const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, tablePermissions: 'Read' @@ -388,7 +388,7 @@ test('check lambda function policy WriteOnly table permissions', () => { const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, tablePermissions: 'Write' @@ -442,7 +442,7 @@ test('check lambda function policy ReadWrite table permissions', () => { const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, tablePermissions: 'ReadWrite' @@ -503,7 +503,7 @@ test('check lambda function policy All table permissions', () => { const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, tablePermissions: 'All' @@ -550,7 +550,7 @@ test('check lambda function custom environment variable', () => { const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, tableEnvironmentVariableName: 'CUSTOM_DYNAMODB_TABLE' @@ -561,7 +561,7 @@ test('check lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -582,7 +582,7 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new LambdaToDynamoDB(stack, "lambda-to-dynamodb-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -633,7 +633,7 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new LambdaToDynamoDB(stack, "lambda-to-dynamodb-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -693,7 +693,7 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new LambdaToDynamoDB(stack, "lambda-to-dynamodb-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -738,7 +738,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const stack = new cdk.Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lambda', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -772,7 +772,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToDynamoDB(stack, "lambda-to-dynamodb-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -790,7 +790,7 @@ test('Test bad table permission', () => { const props: LambdaToDynamoDBProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, tablePermissions: 'Reed', diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/README.md index 53552bc37..a16478bac 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/README.md @@ -32,7 +32,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new LambdaToElasticachememcached(this, 'LambdaToElasticachememcachedPattern', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -69,7 +69,7 @@ import software.amazon.awsconstructs.services.lambdaelasticachememcached.*; new LambdaToElasticachememcached(this, "LambdaToCachePattern", new LambdaToElasticachememcachedProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json index 39d31e5ea..27ca0eb36 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json @@ -397,7 +397,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "VpcConfig": { "SecurityGroupIds": [ { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.ts index e5b8bd347..cc6b4a430 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.ts @@ -28,7 +28,7 @@ const testVpc = getTestVpc(stack, false); const testSG = buildSecurityGroup(stack, 'test-sg', { vpc: testVpc }, [], []); const testFunction = new lambda.Function(stack, 'test-function', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), vpc: testVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json index c9956f0af..d7efaa91f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json @@ -267,7 +267,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.ts index 2d19761f5..126426fbe 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test with new resourcesfor aws- // Definitions const props: LambdaToElasticachememcachedProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json index 64f5e92f6..c0664ed15 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json @@ -267,7 +267,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.ts index 8f386cb2b..5a78887b5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.ts @@ -26,7 +26,7 @@ stack.templateOptions.description = 'Integration Test with new resourcesfor aws- // Definitions const props: LambdaToElasticachememcachedProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts index 19bd12e84..99c126081 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts @@ -31,7 +31,7 @@ test("When provided a VPC, does not create a second VPC", () => { existingVpc, lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, }); @@ -51,7 +51,7 @@ test("When provided an existingCache, does not create a second cache", () => { existingCache, lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, }); @@ -69,7 +69,7 @@ test("When provided an existingFunction, does not create a second function", () const existingVpc = defaults.getTestVpc(stack); const existingFunction = new lambda.Function(stack, "test-function", { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", vpc: existingVpc, functionName: testFunctionName, @@ -95,7 +95,7 @@ test("Test custom environment variable name", () => { new LambdaToElasticachememcached(stack, "test-construct", { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, cacheEndpointEnvironmentVariableName: testEnvironmentVariableName, @@ -137,7 +137,7 @@ test("Test setting custom function properties", () => { new LambdaToElasticachememcached(stack, "test-cache", { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", functionName: testFunctionName, }, @@ -155,7 +155,7 @@ test("Test setting custom cache properties", () => { new LambdaToElasticachememcached(stack, "test-cache", { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, cacheProps: { @@ -175,7 +175,7 @@ test("Test setting custom VPC properties", () => { new LambdaToElasticachememcached(stack, "test-cache", { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, vpcProps: { @@ -194,7 +194,7 @@ test("Test all default values", () => { new LambdaToElasticachememcached(stack, "test-cache", { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, }); @@ -231,7 +231,7 @@ test("Test all default values", () => { }, }, Handler: ".handler", - Runtime: "nodejs14.x", + Runtime: "nodejs16.x", }); // All values taken from elasticache-defaults.ts @@ -255,7 +255,7 @@ test('Test for the proper self referencing security group', () => { new LambdaToElasticachememcached(stack, "test-cache", { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, cacheProps: { @@ -294,7 +294,7 @@ test("Test error from existingCache and no VPC", () => { existingCache, lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, }); @@ -311,7 +311,7 @@ test("Test error from existing function and no VPC", () => { const existingVpc = defaults.getTestVpc(stack); const existingFunction = new lambda.Function(stack, "test-function", { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", vpc: existingVpc, }); @@ -342,7 +342,7 @@ test("Test error from existingCache and cacheProps", () => { }, lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, }); @@ -362,7 +362,7 @@ test("Test error from trying to launch Redis", () => { }, lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }, }); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/README.md index 1e86b69ee..149d0d581 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/README.md @@ -43,7 +43,7 @@ import * as lambda from "aws-cdk-lib/aws-lambda"; const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -93,7 +93,7 @@ import software.amazon.awsconstructs.services.lambdaelasticsearchkibana.*; new LambdaToElasticSearchAndKibana(this, "sample", new LambdaToElasticSearchAndKibanaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json index 26720a9d6..8066cf458 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json @@ -157,7 +157,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.ts index 7b472035c..6feb474e3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, defaults.generateIntegStackName(__filename), {}); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json index 6e418e3cf..722292d18 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json @@ -824,7 +824,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.ts index 51386f04f..bb91a5f77 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.ts @@ -30,7 +30,7 @@ const vpc = defaults.getTestVpc(stack); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json index bfed54f4a..4e19e5267 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json @@ -155,7 +155,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.ts index 76ed4e1b3..5d5a93558 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.ts @@ -28,7 +28,7 @@ const stack = new Stack(app, defaults.generateIntegStackName(__filename), { const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json index d346757a0..649cfa2fc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json @@ -157,7 +157,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.ts index c53d211bd..e722bedc5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, defaults.generateIntegStackName(__filename), {}); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json index ce86b279b..2adc5c262 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json @@ -157,7 +157,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.ts index a7adf0fdc..06b73cc5c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, defaults.generateIntegStackName(__filename), {}); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json index ce7e90443..a6954270e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json @@ -116,7 +116,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.ts index bccfb1d2e..3aa9895c5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json index 3903f2ecc..b49298c56 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json @@ -116,7 +116,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.ts index 6f8934437..9663113ff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts index 7dc4a8d95..59452bd7d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts @@ -106,7 +106,7 @@ test('check lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -545,7 +545,7 @@ test('Test error for Elasticsearch domain VPC props', () => { function getDefaultTestLambdaProps(): lambda.FunctionProps { return { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/README.md index fc44a7db7..f9aa7aaf8 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/README.md @@ -36,7 +36,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new LambdaToEventbridge(this, 'LambdaToEventbridgePattern', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -73,7 +73,7 @@ import software.amazon.awsconstructs.services.lambdaeventbridge.*; new LambdaToEventbridge(this, "LambdaToEventbridgePattern", new LambdaToEventbridgeProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts index 241cbc56d..93e167b64 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts @@ -82,7 +82,7 @@ test('Test minimal deployment with new Lambda function', () => { // Helper declaration const construct = new LambdaToEventbridge(stack, 'lambda-to-eventbridge-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } @@ -134,7 +134,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToEventbridge(stack, "lambda-to-eventbridge-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -157,7 +157,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToEventbridge(stack, 'lambda-to-eventbridge-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -182,7 +182,7 @@ test('Test deployment w/ existing eventbus', () => { new LambdaToEventbridge(stack, 'lambda-to-eventbridge-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -222,7 +222,7 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new LambdaToEventbridge(stack, "lambda-to-eventbridge-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -254,7 +254,7 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new LambdaToEventbridge(stack, "lambda-to-eventbridge-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -295,7 +295,7 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new LambdaToEventbridge(stack, "lambda-to-eventbridge-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -361,7 +361,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const stack = new Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -392,7 +392,7 @@ test('Test lambda function custom environment variable', () => { // Helper declaration new LambdaToEventbridge(stack, 'lambda-to-eventbridge-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -404,7 +404,7 @@ test('Test lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -445,7 +445,7 @@ test('check multiple constructs in a single stack', () => { const props: LambdaToEventbridgeProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, eventBusProps: { eventBusName: 'test' } @@ -462,7 +462,7 @@ test('check multiple lambda functions publishing to single event bus', () => { const props1: LambdaToEventbridgeProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, eventBusProps: { eventBusName: 'test' } @@ -472,7 +472,7 @@ test('check multiple lambda functions publishing to single event bus', () => { const props2: LambdaToEventbridgeProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, existingEventBusInterface: construct.eventBus @@ -508,7 +508,7 @@ test('check multiple lambda functions publishing to single event bus', () => { // Check environment variables template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json index 4c158f101..5ab39a3c3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json @@ -136,7 +136,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.ts index 4a3158eff..99930a321 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-eventbridge // Definitions const props: LambdaToEventbridgeProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json index bfb7470aa..ce8b67b82 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json @@ -165,7 +165,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.ts index 553ddd77c..28bed792c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = "Integration Test for aws-lambda-eventbridge // Definitions const props: LambdaToEventbridgeProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json index 1463f9261..039171e95 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json @@ -177,7 +177,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.ts index baa8e4e41..79291d252 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = "Integration Test for aws-lambda-eventbridge // Definitions const props: LambdaToEventbridgeProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json index 74b0dc3c5..bf5172fd4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json @@ -124,7 +124,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.ts index 0f4a3863f..07afdb8e4 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.ts @@ -26,7 +26,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-eventbridge // Definitions const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json index 4db0259ac..39b2e657e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json @@ -136,7 +136,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.ts index f70aef8b2..3989538e7 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-eventbridge // Definitions const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/README.md index 56fcfc889..b4f908309 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/README.md @@ -36,7 +36,7 @@ const existingFirehoseDeliveryStream = previouslyCreatedKinesisFirehoseToS3Const new LambdaToKinesisFirehose(this, 'LambdaToFirehosePattern', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) }, @@ -84,7 +84,7 @@ existingFirehoseDeliveryStream = previouslyCreatedKinesisFirehoseToS3Construct.k new LambdaToKinesisFirehose(this, "LambdaToFirehosePattern", new LambdaToKinesisFirehoseProps.Builder() .existingKinesisFirehose(existingFirehoseDeliveryStream) .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/README.md index 7019627bb..6a6a4349a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/README.md @@ -36,7 +36,7 @@ import * as lambda from "aws-cdk-lib/aws-lambda"; const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -86,7 +86,7 @@ import software.amazon.awsconstructs.services.lambdaopensearch.*; new LambdaToOpenSearch(this, "sample", new LambdaToOpenSearchProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json index 1396aaae4..17537ccb2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json @@ -157,7 +157,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.ts index b77d3ff06..3b3465e9a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, defaults.generateIntegStackName(__filename), {}); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json index dcd151ef3..075ed1368 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json @@ -157,7 +157,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.ts index 8899bf96b..656d43688 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, defaults.generateIntegStackName(__filename), {}); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json index 7b0282fa7..cdf431648 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json @@ -116,7 +116,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.ts index 5570e298b..f40040eae 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json index 52f57dba3..6f806022f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json @@ -824,7 +824,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.ts index 60030ec27..e7ca370d0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.ts @@ -30,7 +30,7 @@ const vpc = defaults.getTestVpc(stack); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json index 3d7a7573f..95f8a357e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json @@ -116,7 +116,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.ts index 321aefb9a..8330476a9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.ts @@ -23,7 +23,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json index ed70a5689..139b6889e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json @@ -155,7 +155,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.ts index 38f294adf..5f3e4a932 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.ts @@ -28,7 +28,7 @@ const stack = new Stack(app, defaults.generateIntegStackName(__filename), { const lambdaProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts index 437290cab..a3620631e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts @@ -30,7 +30,7 @@ function deployLambdaToOpenSearch(stack: cdk.Stack) { function getDefaultTestLambdaProps(): lambda.FunctionProps { return { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; } @@ -75,7 +75,7 @@ test('Check for an existing Lambda object', () => { const existingLambdaObj = defaults.buildLambdaFunction(stack, { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', functionName: 'test-function' } @@ -108,7 +108,7 @@ test('Check Lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/README.md index 79be99509..911720e6b 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/README.md @@ -32,7 +32,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new LambdaToS3(this, 'LambdaToS3Pattern', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -69,7 +69,7 @@ import software.amazon.awsconstructs.services.lambdas3.*; new LambdaToS3(this, "LambdaToS3Pattern", new LambdaToS3Props.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json index 854411e6f..2ed044729 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json @@ -150,7 +150,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.ts index fd3b1ad7f..fa78562bc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.ts @@ -25,7 +25,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); new LambdaToS3(stack, 'test-lambda-s3', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json index 914069911..b9545b2ce 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json @@ -151,7 +151,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.ts index f6635ef62..3fcb74de5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.ts @@ -27,7 +27,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-s3'; // Definitions const props: LambdaToS3Props = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json index c664e4f07..c52d3448b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json @@ -192,7 +192,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.ts index d48f0b246..c7376b46e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.ts @@ -27,7 +27,7 @@ import * as defaults from '@aws-solutions-constructs/core'; // Definitions const props: LambdaToS3Props = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json index c2e776610..3285914cf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json @@ -151,7 +151,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.ts index 558c9da98..6cae658ce 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-s3'; // Definitions const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json index b283f1927..8ca6bc3ed 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json @@ -199,7 +199,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts index 89da32b4d..24ed2047b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts @@ -30,7 +30,7 @@ const mybucket: s3.IBucket = s3.Bucket.fromBucketName(stack, 'mybucket', existin const props: LambdaToS3Props = { existingBucketObj: mybucket, lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts index 7edaa41c6..2b1522287 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts @@ -29,7 +29,7 @@ test('Test the properties', () => { // Helper declaration const pattern = new LambdaToS3(stack, 'lambda-to-s3-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -53,7 +53,7 @@ test('Test the bucketProps override', () => { // Helper declaration new LambdaToS3(stack, 'lambda-to-s3-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -78,7 +78,7 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new LambdaToS3(stack, "lambda-to-s3-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -129,7 +129,7 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new LambdaToS3(stack, "lambda-to-s3-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -189,7 +189,7 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new LambdaToS3(stack, "lambda-to-s3-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -234,7 +234,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const stack = new Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -268,7 +268,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToS3(stack, "lambda-to-s3-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -293,7 +293,7 @@ test('Test lambda function custom environment variable', () => { new LambdaToS3(stack, 'lambda-to-s3-stack', { existingBucketObj: mybucket, lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -304,7 +304,7 @@ test('Test lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -329,7 +329,7 @@ test("Test bad call with existingBucket and bucketProps", () => { // Helper declaration new LambdaToS3(stack, "bad-s3-args", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -348,7 +348,7 @@ test('Test that CheckProps() is flagging errors correctly', () => { const stack = new Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -357,7 +357,7 @@ test('Test that CheckProps() is flagging errors correctly', () => { new LambdaToS3(stack, "lambda-to-s3-stack", { existingLambdaObj: testLambdaFunction, lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -380,7 +380,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { new LambdaToS3(stack, 'lambda-s3', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, bucketProps: { @@ -419,7 +419,7 @@ test('s3 bucket with one content bucket and no logging bucket', () => { new LambdaToS3(stack, 'lambda-s3', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, bucketProps: { @@ -438,7 +438,7 @@ test('Test bad bucket permission', () => { const props = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, bucketProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/README.md index 3f43cfd36..fcb6bc26c 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/README.md @@ -109,7 +109,7 @@ new LambdaToSagemakerEndpoint(this, "LambdaToSagemakerEndpointPattern", .executionRoleArn("executionRoleArn") .build()) .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .timeout(Duration.minutes(5)) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/README.md index 96f7a3670..e3e184713 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/README.md @@ -36,7 +36,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; const constructProps: LambdaToSecretsmanagerProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`lambda`), handler: 'index.handler' }, @@ -77,7 +77,7 @@ import software.amazon.awsconstructs.services.lambdasecretsmanager.*; new LambdaToSecretsmanager(this, "test-lambda-secretsmanager-stack", new LambdaToSecretsmanagerProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json index c5ba55a2f..abd995aa7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json @@ -124,7 +124,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.ts index 8b0ac6d51..88280cd17 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-secretsmana // Definitions const props: LambdaToSecretsmanagerProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json index 6b44d2cfb..8d0505d94 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json @@ -875,7 +875,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.ts index 7ef1f104a..29bcee758 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.ts @@ -35,7 +35,7 @@ const vpc = defaults.buildVpc(stack, { // Definitions const props: LambdaToSecretsmanagerProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json index ffb0e295c..b613ac9e0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json @@ -165,7 +165,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.ts index e1af6b974..3fb328cb1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = "Integration Test for aws-lambda-secretsmana // Definitions const props: LambdaToSecretsmanagerProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json index 65fbc438b..377c92c56 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json @@ -124,7 +124,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.ts index 99a92499c..94e5376c2 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-secretsmana // Definitions const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts index be251a314..e693e5891 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts @@ -29,7 +29,7 @@ test('Test the properties', () => { // Helper declaration const pattern = new LambdaToSecretsmanager(stack, 'lambda-to-secretsmanager-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -53,7 +53,7 @@ test('Test deployment w/ existing secret', () => { const existingSecret = new Secret(stack, 'secret', {}); const pattern = new LambdaToSecretsmanager(stack, 'lambda-to-secretsmanager-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -76,7 +76,7 @@ test('Test deployment w/ existing function', () => { const stack = new Stack(); // Helper declaration const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -104,7 +104,7 @@ test('Test minimal deployment write access to Secret', () => { // Helper declaration new LambdaToSecretsmanager(stack, 'lambda-to-secretsmanager-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -128,7 +128,7 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new LambdaToSecretsmanager(stack, "lambda-to-secretsmanager-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -180,7 +180,7 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new LambdaToSecretsmanager(stack, "lambda-to-secretsmanager-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -241,7 +241,7 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new LambdaToSecretsmanager(stack, "lambda-to-secretsmanager-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -287,7 +287,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const stack = new Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -322,7 +322,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToSecretsmanager(stack, "lambda-to-secretsmanager-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -345,7 +345,7 @@ test('Test lambda function custom environment variable', () => { // Helper declaration new LambdaToSecretsmanager(stack, 'lambda-to-secretsmanager-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -360,7 +360,7 @@ test('Test lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -386,7 +386,7 @@ test('Test overriding secretProps to pass a customer provided CMK', () => { // Helper declaration new LambdaToSecretsmanager(stack, 'lambda-to-secretsmanager-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -402,7 +402,7 @@ test('Test overriding secretProps to pass a customer provided CMK', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/README.md index 3fb82f8e7..d7034ad76 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/README.md @@ -32,7 +32,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new LambdaToSns(this, 'test-lambda-sns', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -70,7 +70,7 @@ import software.amazon.awsconstructs.services.lambdasns.*; new LambdaToSns(this, "test-lambda-sns-stack", new LambdaToSnsProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json index 3f56fd07e..5b7927327 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json @@ -127,7 +127,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.ts index 1e549c4ec..047517fe0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-sns'; // Definitions const props: LambdaToSnsProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json index 8ccdb9ac2..c9e10345b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json @@ -168,7 +168,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.ts index bb6264c91..1d840893b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = "Integration Test for aws-lambda-sns"; // Definitions const props: LambdaToSnsProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json index 0913938c4..26ac8d886 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json @@ -127,7 +127,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.ts index 3683fe405..2298328fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-sns'; // Definitions const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts index e0d58048c..9cb585c4c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts @@ -29,7 +29,7 @@ test('Test deployment with new Lambda function', () => { // Helper declaration const testConstruct = new LambdaToSns(stack, 'lambda-to-sns-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -94,7 +94,7 @@ test('Test deployment with existing existingTopicObj', () => { // Helper declaration new LambdaToSns(stack, 'lambda-to-sns-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -119,7 +119,7 @@ test('override topicProps', () => { const props: LambdaToSnsProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, topicProps: { @@ -144,7 +144,7 @@ test('Test the properties', () => { // Helper declaration const pattern = new LambdaToSns(stack, 'lambda-to-sns-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } @@ -166,7 +166,7 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new LambdaToSns(stack, "lambda-to-sns-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -217,7 +217,7 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new LambdaToSns(stack, "lambda-to-sns-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -277,7 +277,7 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new LambdaToSns(stack, "lambda-to-sns-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -322,7 +322,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const stack = new Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -356,7 +356,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToSns(stack, "lambda-to-sns-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -378,7 +378,7 @@ test('Test lambda function custom environment variable', () => { // Helper declaration new LambdaToSns(stack, 'lambda-to-sns-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -390,7 +390,7 @@ test('Test lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -414,7 +414,7 @@ test('Topic is encrypted with imported CMK when set on encryptionKey prop', () = const cmk = new kms.Key(stack, 'cmk'); new LambdaToSns(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -441,7 +441,7 @@ test('Topic is encrypted with imported CMK when set on topicProps.masterKey prop const cmk = new kms.Key(stack, 'cmk'); new LambdaToSns(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -469,7 +469,7 @@ test('Topic is encrypted with provided encrytionKeyProps', () => { new LambdaToSns(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -507,7 +507,7 @@ test('Topic is encrypted by default with AWS-managed KMS key when no other encry new LambdaToSns(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -546,7 +546,7 @@ test('Topic is encrypted with customer managed KMS Key when enable encryption fl new LambdaToSns(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/README.md index b10313a28..5ce3c4efa 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/README.md @@ -36,12 +36,12 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new LambdaToSqsToLambda(this, 'LambdaToSqsToLambdaPattern', { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`producer-lambda`) }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`consumer-lambda`) } @@ -84,12 +84,12 @@ import software.amazon.awsconstructs.services.lambdasqslambda.*; new LambdaToSqsToLambda(this, "LambdaToSqsToLambdaPattern", new LambdaToSqsToLambdaProps.Builder() .producerLambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("producer-lambda")) .handler("index.handler") .build()) .consumerLambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("consumer-lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json index f5845e1ec..ebdcef715 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json @@ -128,7 +128,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } @@ -449,7 +449,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.ts index f0ea27c7d..17ad1a47b 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.ts @@ -25,12 +25,12 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-sqs-lambda' // Definitions const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`) }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json index 3391b3503..40b1ad280 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json @@ -169,7 +169,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, @@ -891,7 +891,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.ts index eeddefb7c..1d157343a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.ts @@ -25,12 +25,12 @@ stack.templateOptions.description = "Integration Test for aws-lambda-sqs-lambda" // Definitions const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`) }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json index 3f8705ff3..ce8eeeb53 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json @@ -127,7 +127,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } @@ -296,7 +296,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.ts index c884a5d95..7d6d8bc5a 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-sqs-lambda' // Definitions const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`) }; @@ -34,7 +34,7 @@ const existingConsumerFn = defaults.deployLambdaFunction(stack, lambdaFunctionPr const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json index 2e305ffdc..8c957b531 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json @@ -128,7 +128,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } @@ -449,7 +449,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.ts index 8c4e679ea..850bfca90 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-sqs-lambda' // Definitions const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`) }; @@ -35,7 +35,7 @@ const existingProducerFn = defaults.deployLambdaFunction(stack, lambdaFunctionPr const props: LambdaToSqsToLambdaProps = { existingProducerLambdaObj: existingProducerFn, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json index caf80b5ac..f8cfe92f8 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json @@ -207,7 +207,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } @@ -361,7 +361,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.ts index b436bdb9f..b136910ab 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.ts @@ -28,13 +28,13 @@ const buildQueueResponse = defaults.buildQueue(stack, 'existing-sqs-queue', {}); const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`) }, existingQueueObj: buildQueueResponse.queue, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts index 2fc74b6a8..b95479002 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts @@ -28,13 +28,13 @@ test('Test minimal deployment', () => { // Helper declaration const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' @@ -126,7 +126,7 @@ test('Test deployment w/ existing producer function', () => { // Define existing resources const existingProducerFn = defaults.buildLambdaFunction(stack, { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'existing-producer-function' @@ -136,7 +136,7 @@ test('Test deployment w/ existing producer function', () => { const props: LambdaToSqsToLambdaProps = { existingProducerLambdaObj: existingProducerFn, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'deployed-consumer-function' @@ -164,7 +164,7 @@ test('Test deployment w/ existing consumer function', () => { // Define existing resources const existingConsumerFn = defaults.buildLambdaFunction(stack, { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'existing-consumer-function' @@ -173,7 +173,7 @@ test('Test deployment w/ existing consumer function', () => { // Helper declaration const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'deployed-producer-function' @@ -208,13 +208,13 @@ test('Test deployment w/ existing queue', () => { // Helper declaration const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' @@ -239,12 +239,12 @@ test('Test deployment w/ DLQ explicitly disabled', () => { // Helper declaration const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`) }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`) }, @@ -270,12 +270,12 @@ test('Test deployment w/ DLQ explicitly enabled and w/ MRC override', () => { // Helper declaration const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`) }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`) }, @@ -308,13 +308,13 @@ test('Test overrides for producer and consumer functions', () => { // Helper declaration const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' @@ -325,11 +325,11 @@ test('Test overrides for producer and consumer functions', () => { // Assertion 2: test for updated runtime on producer function const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { - Runtime: "nodejs14.x" + Runtime: "nodejs16.x" }); // Assertion 3: test for updated runtime on consumer function template.hasResourceProperties('AWS::Lambda::Function', { - Runtime: "nodejs14.x" + Runtime: "nodejs16.x" }); }); @@ -342,13 +342,13 @@ test('Test the public pattern props', () => { // Helper declaration const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' @@ -375,13 +375,13 @@ test('Test lambda function custom environment variable', () => { // Helper declaration const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' @@ -412,13 +412,13 @@ test('Pattern deployment w/ batch size', () => { const stack = new Stack(); const props: LambdaToSqsToLambdaProps = { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' @@ -444,13 +444,13 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new LambdaToSqsToLambda(stack, "lambda-to-sqs-to-lambda-stack", { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' @@ -502,13 +502,13 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new LambdaToSqsToLambda(stack, "lambda-to-sqs-to-lambda-stack", { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' @@ -569,13 +569,13 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new LambdaToSqsToLambda(stack, "lambda-to-sqs-to-lambda-stack", { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' @@ -623,13 +623,13 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToSqsToLambda(stack, "lambda-to-sqs-to-lambda-stack", { producerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/producer-function`), functionName: 'producer-function' }, consumerLambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda/consumer-function`), functionName: 'consumer-function' diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/README.md index 062b58463..502a8123d 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/README.md @@ -32,7 +32,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new LambdaToSqs(this, 'LambdaToSqsPattern', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -70,7 +70,7 @@ import software.amazon.awsconstructs.services.lambdasqs.*; new LambdaToSqs(this, "test-lambda-sqs-stack", new LambdaToSqsProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json index 07a78d147..966e2d9e8 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json @@ -128,7 +128,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.ts index 74f74b351..c4987a121 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-sqs'; // Definitions const props: LambdaToSqsProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json index d10cd8b60..d54428b69 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json @@ -169,7 +169,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.ts index 1921a4687..a292b54a6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = "Integration Test for aws-lambda-sqs"; // Definitions const props: LambdaToSqsProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json index 374630636..9944b622e 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json @@ -128,7 +128,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.ts index 9b95a37ce..918e66a4f 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-sqs'; // Definitions const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts index 15d85531c..43e48f02e 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts @@ -28,7 +28,7 @@ test('Test the properties', () => { // Helper declaration const pattern = new LambdaToSqs(stack, 'lambda-to-sqs-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -53,7 +53,7 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new LambdaToSqs(stack, "lambda-to-sqs-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -104,7 +104,7 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new LambdaToSqs(stack, "lambda-to-sqs-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -164,7 +164,7 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new LambdaToSqs(stack, "lambda-to-sqs-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -209,7 +209,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const stack = new Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -243,7 +243,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToSqs(stack, "lambda-to-sqs-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -265,7 +265,7 @@ test('Test lambda function custom environment variable', () => { // Helper declaration new LambdaToSqs(stack, 'lambda-to-sqs-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -276,7 +276,7 @@ test('Test lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -294,7 +294,7 @@ test('Queue is encrypted with imported CMK when set on encryptionKey prop', () = const cmk = new kms.Key(stack, 'cmk'); new LambdaToSqs(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -321,7 +321,7 @@ test('Queue is encrypted with imported CMK when set on queueProps.encryptionMast const cmk = new kms.Key(stack, 'cmk'); new LambdaToSqs(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -349,7 +349,7 @@ test('Queue is encrypted with provided encrytionKeyProps', () => { new LambdaToSqs(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -387,7 +387,7 @@ test('Queue is encrypted by default with SQS-managed KMS key when no other encry new LambdaToSqs(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -407,7 +407,7 @@ test('Queue is encrypted with customer managed KMS Key when enable encryption fl new LambdaToSqs(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -446,7 +446,7 @@ test('Queue purging flag grants correct permissions', () => { new LambdaToSqs(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/README.md index 51dcb4dd2..aed870756 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/README.md @@ -36,7 +36,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; const constructProps: LambdaToSsmstringparameterProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`lambda`), handler: 'index.handler' }, @@ -82,7 +82,7 @@ import software.amazon.awsconstructs.services.lambdassmstringparameter.*; new LambdaToSsmstringparameter(this, "test-lambda-ssmstringparameter-stack", new LambdaToSsmstringparameterProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json index 436a30b8b..d891590f7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json @@ -146,7 +146,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.ts index f944146b7..1e0c6314c 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-ssmstringpa // Definitions const props: LambdaToSsmstringparameterProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json index 817693b24..cb2ca1af1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json @@ -897,7 +897,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.ts index f3850b6fa..3b4d34ab6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.ts @@ -35,7 +35,7 @@ const vpc = defaults.buildVpc(stack, { // Definitions const props: LambdaToSsmstringparameterProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json index 044da5b09..ac2fa43fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json @@ -187,7 +187,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.ts index ec4d9e608..1ed2eb7e1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = "Integration Test for aws-lambda-ssmstringpa // Definitions const props: LambdaToSsmstringparameterProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json index 9abdc6797..c8bcfc575 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json @@ -146,7 +146,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.ts index 8e692624d..fd280df21 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-lambda-ssmstringpa // Definitions const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json index 97a664bf8..6e184391f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json @@ -153,7 +153,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.ts index 9c7fa9c04..4c3fab726 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.ts @@ -27,7 +27,7 @@ const existingStringParam = new StringParameter(stack, 'myNewStringParameter', { // Definitions const props: LambdaToSsmstringparameterProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts index 4caafa03f..db3f570b9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts @@ -30,7 +30,7 @@ test('Test lambda function custom environment variable', () => { // Helper declaration new LambdaToSsmstringparameter(stack, 'lambda-to-ssm-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -45,7 +45,7 @@ test('Test lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -66,7 +66,7 @@ test('Test the properties', () => { // Helper declaration const pattern = new LambdaToSsmstringparameter(stack, 'lambda-to-ssm-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -90,7 +90,7 @@ test('Test deployment w/ existing String Parameter', () => { const existingStringParam = new StringParameter(stack, 'myNewStringParameter', {stringValue: "test-string-value" }); const pattern = new LambdaToSsmstringparameter(stack, 'lambda-to-ssm-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -115,7 +115,7 @@ test('Test deployment w/ existing function', () => { const stack = new Stack(); // Helper declaration const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -144,7 +144,7 @@ test('Test minimal deployment write access to String Parameter ', () => { // Helper declaration new LambdaToSsmstringparameter(stack, 'lambda-to-ssm-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -169,7 +169,7 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new LambdaToSsmstringparameter(stack, 'lambda-to-ssm-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -221,7 +221,7 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new LambdaToSsmstringparameter(stack, 'lambda-to-ssm-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -282,7 +282,7 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new LambdaToSsmstringparameter(stack, 'lambda-to-ssm-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -328,7 +328,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const stack = new Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -363,7 +363,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToSsmstringparameter(stack, "lambda-to-ssm-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -384,7 +384,7 @@ test("Test bad call with invalid string parameter permission", () => { // Helper declaration new LambdaToSsmstringparameter(stack, "lambda-to-ssm-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/README.md index 66087eaf2..79294aa63 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/README.md @@ -35,7 +35,7 @@ const startState = new stepfunctions.Pass(this, 'StartState'); new LambdaToStepfunctions(this, 'LambdaToStepfunctionsPattern', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) }, @@ -85,7 +85,7 @@ final Pass startState = new Pass(this, "StartState"); new LambdaToStepfunctions(this, "test-lambda-stepfunctions-stack", new LambdaToStepfunctionsProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json index 5b143ae00..cf8519009 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json @@ -265,7 +265,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts index fbfddad5a..7bf44dcb1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts @@ -28,7 +28,7 @@ const startState = new stepfunctions.Pass(stack, 'StartState'); // Setup the pattern props const props: LambdaToStepfunctionsProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json index b6a15e9ab..818d0a749 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json @@ -307,7 +307,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.ts index 7039ee02d..b22b1652b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.ts @@ -29,7 +29,7 @@ const startState = new stepfunctions.Pass(stack, 'StartState'); // Definitions const props: LambdaToStepfunctionsProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json index 710fba8bd..1d02f85e7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json @@ -120,7 +120,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.ts index 3eb37c182..5c7fea70e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.ts @@ -28,7 +28,7 @@ const startState = new stepfunctions.Pass(stack, 'StartState'); // Setup the "existing" Lambda function props const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts index 8606e5b2a..040fdc55c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts @@ -30,7 +30,7 @@ test('Test deployment with new Lambda function', () => { const startState = new stepfunctions.Pass(stack, 'StartState'); new LambdaToStepfunctions(stack, 'lambda-to-step-function-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -64,7 +64,7 @@ test('Test deployment with existing Lambda function', () => { // Helper declaration const startState = new stepfunctions.Pass(stack, 'StartState'); const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -99,7 +99,7 @@ test('Test invocation permissions', () => { // Helper declaration const startState = new stepfunctions.Pass(stack, 'StartState'); const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -150,7 +150,7 @@ test('Test the properties', () => { const startState = new stepfunctions.Pass(stack, 'StartState'); const pattern = new LambdaToStepfunctions(stack, 'lambda-to-step-function-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -183,7 +183,7 @@ test('Test the properties with no CW Alarms', () => { const startState = new stepfunctions.Pass(stack, 'StartState'); const pattern = new LambdaToStepfunctions(stack, 'lambda-to-step-function-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -215,7 +215,7 @@ test('Test lambda function custom environment variable', () => { const startState = new stepfunctions.Pass(stack, 'StartState'); new LambdaToStepfunctions(stack, 'lambda-to-step-function-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -229,7 +229,7 @@ test('Test lambda function custom environment variable', () => { const template = Template.fromStack(stack); template.hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', @@ -251,7 +251,7 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Helper declaration new LambdaToStepfunctions(stack, "lambda-to-stepfunctions-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -306,7 +306,7 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Helper declaration new LambdaToStepfunctions(stack, "lambda-to-stepfunctions-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -369,7 +369,7 @@ test("Test minimal deployment with an existing VPC", () => { // Helper declaration new LambdaToStepfunctions(stack, "lambda-to-stepfunctions-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -418,7 +418,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const startState = new stepfunctions.Pass(stack, 'StartState'); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -455,7 +455,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToStepfunctions(stack, "lambda-to-stepfunctions-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -477,7 +477,7 @@ test('check LogGroup name', () => { const startState = new stepfunctions.Pass(stack, 'StartState'); new LambdaToStepfunctions(stack, 'lambda-to-step-function-stack', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/README.md index 3a4ef39bd..56ae1f980 100755 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/README.md @@ -33,7 +33,7 @@ import { S3ToLambdaProps, S3ToLambda } from '@aws-solutions-constructs/aws-s3-la new S3ToLambda(this, 'test-s3-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }); @@ -70,7 +70,7 @@ import software.amazon.awsconstructs.services.s3lambda.*; new S3ToLambda(this, "test-s3-lambda'", new S3ToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json index e38cb195b..dac0c3663 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json @@ -202,7 +202,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts index bbbbe9596..2ff9ac1e0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts @@ -28,7 +28,7 @@ const myBucket = CreateScrapBucket(stack, {}); const props: S3ToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, existingBucketObj: myBucket diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json index a26850fb0..10c85e0e7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json @@ -110,7 +110,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts index 6b71da5dd..85b7b0ce0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts @@ -27,7 +27,7 @@ const stack = new Stack(app, generateIntegStackName(__filename)); const props: S3ToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, bucketProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts index acd6280cb..ba766158b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts @@ -22,7 +22,7 @@ function deployNewFunc(stack: cdk.Stack) { const props: S3ToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, bucketProps: { @@ -74,7 +74,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { new S3ToLambda(stack, 's3-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, bucketProps: { @@ -113,7 +113,7 @@ test('s3 bucket with one content bucket and no logging bucket', () => { new S3ToLambda(stack, 's3-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, bucketProps: { @@ -132,7 +132,7 @@ test('check properties with existing S3 bucket', () => { const construct = new S3ToLambda(stack, 's3-lambda', { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, existingBucketObj: existingBucket diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/README.md index 1f02e2346..d508a30eb 100755 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/README.md @@ -32,7 +32,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new SnsToLambda(this, 'test-sns-lambda', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -68,7 +68,7 @@ import software.amazon.awsconstructs.services.snslambda.*; new SnsToLambda(this, "test-lambda-sqs-stack", new SnsToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json index 1998e9709..d96ac9479 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json @@ -111,7 +111,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.ts index 627d9ca08..1091890b1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-sns-lambda'; // Definitions const props: SnsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) } diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts index 3f09481c4..1e4f0b71c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts @@ -22,7 +22,7 @@ function deployNewFunc(stack: cdk.Stack) { const props: SnsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }; @@ -45,7 +45,7 @@ test('override topicProps', () => { const props: SnsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, topicProps: { @@ -71,7 +71,7 @@ test('provide existingTopicObj', () => { const props: SnsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, existingTopicObj: topic @@ -91,7 +91,7 @@ test('Topic is encrypted with imported CMK when set on encryptionKey prop', () = const props: SnsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, encryptionKey: cmk @@ -116,7 +116,7 @@ test('Topic is encrypted with imported CMK when set on topicProps.masterKey prop const props: SnsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, topicProps: { @@ -143,7 +143,7 @@ test('Topic is encrypted with provided encrytionKeyProps', () => { const props: SnsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, encryptionKeyProps: { @@ -180,7 +180,7 @@ test('Topic is encrypted by default with AWS-managed KMS key when no other encry const props: SnsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, }; @@ -218,7 +218,7 @@ test('Topic is encrypted with customer managed KMS Key when enable encryption fl const props: SnsToLambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, enableEncryptionWithCustomerManagedKey: true diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/README.md index d406920bc..e6d88dd8b 100755 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/README.md @@ -32,7 +32,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; new SqsToLambda(this, 'SqsToLambdaPattern', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -70,7 +70,7 @@ import software.amazon.awsconstructs.services.sqslambda.*; new SqsToLambda(this, "SnsToSqsPattern", new SqsToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json index 0e33ea98c..b74d97aac 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json @@ -127,7 +127,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.ts index 70a677b7a..9258bae88 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-sqs-lambda with FI // Definitions const props: SqsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json index 488ada4b1..76909919a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json @@ -127,7 +127,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.ts index 240a47147..5052f734e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-sqs-lambda'; // Definitions const props: SqsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json index 751d913a0..b573f41ee 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json @@ -127,7 +127,7 @@ } }, "Handler": "index.handler", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" } diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.ts index c31e92086..7962b181d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.ts @@ -25,7 +25,7 @@ stack.templateOptions.description = 'Integration Test for aws-sqs-lambda'; // Definitions const lambdaFunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts index bf4ddff74..efbc2b91f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts @@ -27,7 +27,7 @@ test('Pattern deployment w/ new Lambda function and overridden props', () => { const stack = new Stack(); const props: SqsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -63,7 +63,7 @@ test('Test getter methods', () => { const stack = new Stack(); const props: SqsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }, @@ -123,7 +123,7 @@ test('Pattern deployment w/ batch size', () => { const stack = new Stack(); const props: SqsToLambdaProps = { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -145,7 +145,7 @@ test('Queue is encrypted with imported CMK when set on encryptionKey prop', () = const cmk = new kms.Key(stack, 'cmk'); new SqsToLambda(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -172,7 +172,7 @@ test('Queue is encrypted with imported CMK when set on queueProps.encryptionMast const cmk = new kms.Key(stack, 'cmk'); new SqsToLambda(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -200,7 +200,7 @@ test('Queue is encrypted with provided encrytionKeyProps', () => { new SqsToLambda(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -238,7 +238,7 @@ test('Queue is encrypted by default with SQS-managed KMS key when no other encry new SqsToLambda(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { @@ -258,7 +258,7 @@ test('Queue is encrypted with customer managed KMS Key when enable encryption fl new SqsToLambda(stack, 'test-construct', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), environment: { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/README.md b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/README.md index ae73fb60f..a085ad543 100755 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/README.md @@ -38,7 +38,7 @@ import { WafwebaclToApiGatewayProps, WafwebaclToApiGateway } from "@aws-solution const apiGatewayToLambda = new ApiGatewayToLambda(this, 'ApiGatewayToLambdaPattern', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`) } @@ -91,7 +91,7 @@ import software.amazon.awsconstructs.services.wafwebaclapigateway.*; final ApiGatewayToLambda apiGatewayToLambda = new ApiGatewayToLambda(this, "ApiGatewayToLambdaPattern", new ApiGatewayToLambdaProps.Builder() .lambdaFunctionProps(new FunctionProps.Builder() - .runtime(Runtime.NODEJS_14_X) + .runtime(Runtime.NODEJS_16_X) .code(Code.fromAsset("lambda")) .handler("index.handler") .build()) diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json index 0c75a7547..a8c3a785d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json @@ -47,7 +47,7 @@ ] }, "Handler": ".handler", - "Runtime": "nodejs14.x" + "Runtime": "nodejs16.x" }, "DependsOn": [ "testOneFunctionServiceRole3F9CD9E7" @@ -500,7 +500,7 @@ ] }, "Handler": ".handler", - "Runtime": "nodejs14.x" + "Runtime": "nodejs16.x" }, "DependsOn": [ "testTwoFunctionServiceRoleF678C905" diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json index 914ea11b1..0f7c7a7ec 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json @@ -47,7 +47,7 @@ ] }, "Handler": ".handler", - "Runtime": "nodejs14.x" + "Runtime": "nodejs16.x" }, "DependsOn": [ "testFunctionServiceRoleFEC29B6F" diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json index 408ac35b8..b48ef6055 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json @@ -47,7 +47,7 @@ ] }, "Handler": ".handler", - "Runtime": "nodejs14.x" + "Runtime": "nodejs16.x" }, "DependsOn": [ "testFunctionServiceRoleFEC29B6F" diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test-helper.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test-helper.ts index 26466bf45..0422fc53f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test-helper.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test-helper.ts @@ -19,7 +19,7 @@ import { addCfnSuppressRules } from "@aws-solutions-constructs/core"; export function CreateTestApi(stack: Stack, id: string): api.LambdaRestApi { const lamdaFunction = new lambda.Function(stack, `${id}Function`, { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }); addCfnSuppressRules(lamdaFunction, [{ id: "W58", reason: "Test Resource" }]); diff --git a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts index 3a5f27c16..88214dc57 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts @@ -152,9 +152,9 @@ export function deployLambdaFunction(scope: Construct, const lambdafunction = new lambda.Function(scope, _functionId, finalLambdaFunctionProps); - if (lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_14_X || - lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_14_X || - lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_14_X) { + if (lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_16_X || + lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_16_X || + lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_16_X) { lambdafunction.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true }); } diff --git a/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts index c31771855..fc9473348 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts @@ -552,7 +552,7 @@ function CreateTestLoadBalancer(stack: Stack, vpc: ec2.IVpc): elb.ApplicationLoa function CreateTestFunction(stack: Stack, id: string): lambda.Function { return new lambda.Function(stack, id, { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", }); } diff --git a/source/patterns/@aws-solutions-constructs/core/test/apigateway-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/apigateway-helper.test.ts index 544061793..36ce2f317 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/apigateway-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/apigateway-helper.test.ts @@ -20,7 +20,7 @@ import { Template } from 'aws-cdk-lib/assertions'; function deployRegionalApiGateway(stack: Stack) { const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -90,7 +90,7 @@ test('Test override for RegionalApiGateway', () => { const stack = new Stack(); const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -121,7 +121,7 @@ test('Test override for GlobalApiGateway', () => { const stack = new Stack(); const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -150,7 +150,7 @@ test('Test override for GlobalApiGateway', () => { test('Test ApiGateway::Account resource for RegionalApiGateway', () => { const stack = new Stack(); const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -173,7 +173,7 @@ test('Test ApiGateway::Account resource for RegionalApiGateway', () => { test('Test ApiGateway::Account resource for GlobalApiGateway', () => { const stack = new Stack(); const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -386,7 +386,7 @@ test('Test for Exception while overriding restApiProps using endPointTypes', () test('Test for Exception while overriding LambdaRestApiProps using endPointTypes', () => { const stack = new Stack(); const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -643,7 +643,7 @@ test('Test for ApiKey creation using restApiProps', () => { test('Test for ApiKey creation using lambdaApiProps', () => { const stack = new Stack(); const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-api-gateway-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-api-gateway-helper.test.ts index 014838d77..4a7acc86a 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-api-gateway-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-api-gateway-helper.test.ts @@ -262,7 +262,7 @@ test('test override cloudfront add custom cloudfront function', () => { // APIG Lambda function const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; @@ -389,7 +389,7 @@ test('test override cloudfront replace custom lambda@edge', () => { // custom lambda@edg function const handler = new lambda.Function(stack, 'SomeHandler', { functionName: 'SomeHandler', - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -400,7 +400,7 @@ test('test override cloudfront replace custom lambda@edge', () => { // APIG Lambda function const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`) }; diff --git a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts index f16b399e3..047d61509 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts @@ -438,7 +438,7 @@ test('test override cloudfront replace custom lambda@edge', () => { // custom lambda@edg function const handler = new lambda.Function(stack, 'SomeHandler', { functionName: 'SomeHandler', - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts index 37db0fbe9..a02eb4d33 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts @@ -57,12 +57,12 @@ test("Test fail Lambda function check", () => { const props: defaults.VerifiedProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", }, existingLambdaObj: new lambda.Function(stack, "placeholder", { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", }), }; diff --git a/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts index 61c9a5cff..ab08fde1a 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts @@ -44,7 +44,7 @@ test("test FunctionProps override timeout", () => { const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", timeout: Duration.seconds(5), }; @@ -56,7 +56,7 @@ test("test FunctionProps override timeout", () => { Role: { "Fn::GetAtt": ["LambdaFunctionServiceRole0C4CDE0B", "Arn"], }, - Runtime: "nodejs14.x", + Runtime: "nodejs16.x", Timeout: 5, }); }); @@ -66,7 +66,7 @@ test("test FunctionProps for environment variable when runtime = NODEJS", () => const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", }; @@ -77,7 +77,7 @@ test("test FunctionProps for environment variable when runtime = NODEJS", () => Role: { "Fn::GetAtt": ["LambdaFunctionServiceRole0C4CDE0B", "Arn"], }, - Runtime: "nodejs14.x", + Runtime: "nodejs16.x", Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1", @@ -117,7 +117,7 @@ test("test buildLambdaFunction with deploy = true", () => { const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda-test`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", }; @@ -130,7 +130,7 @@ test("test buildLambdaFunction with deploy = true", () => { Role: { "Fn::GetAtt": ["LambdaFunctionServiceRole0C4CDE0B", "Arn"], }, - Runtime: "nodejs14.x", + Runtime: "nodejs16.x", }); }); @@ -139,7 +139,7 @@ test("test buildLambdaFunction with existing Lambda function (no VPC)", () => { const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda-test`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", }; @@ -210,7 +210,7 @@ test("test buildLambdaFunction when Lambda properties includes a VPC", () => { const fakeVpc = new ec2.Vpc(stack, "vpc", {}); const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), vpc: fakeVpc, @@ -249,7 +249,7 @@ test("Test for error if VPC in arguments AND in Lambda Function properties", () const fakeVpc = new ec2.Vpc(stack, "vpc", {}); const lambdaFunctionProps: lambda.FunctionProps = { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), vpc: fakeVpc, @@ -267,7 +267,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const stack = new Stack(); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -294,7 +294,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function const testVpc = new ec2.Vpc(stack, "test-vpc", {}); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), vpc: testVpc, @@ -316,7 +316,7 @@ test("Test generating synthesized permission IDs", () => { const coreName = "TestInvokePermission"; const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -345,7 +345,7 @@ test("Test invalid synthesized permission names", () => { const coreName = "TestInvokePermission"; const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }); @@ -366,13 +366,13 @@ test("Test invalid synthesized permission names", () => { expect(app).toThrowError(); }); -test('Test environment variable for NodeJS 14.x', () => { +test('Test environment variable for NodeJS 16.x', () => { // Stack const stack = new Stack(); const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; @@ -384,7 +384,7 @@ test('Test environment variable for NodeJS 14.x', () => { Role: { 'Fn::GetAtt': ['LambdaFunctionServiceRole0C4CDE0B', 'Arn'] }, - Runtime: 'nodejs14.x', + Runtime: 'nodejs16.x', Environment: { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1' @@ -398,7 +398,7 @@ test('Test minimum deployment with an existing VPC as a vpc parameter in deployL const stack = new Stack(); const inProps: lambda.FunctionProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }; const fakeVpc: ec2.Vpc = new ec2.Vpc(stack, 'vpc', {}); @@ -436,7 +436,7 @@ test("Test retrieving lambda vpc security group ids", () => { const securityGroup2 = new ec2.SecurityGroup(stack, 'SecurityGroup2', { vpc }); const testLambdaFunction = new lambda.Function(stack, 'test-lamba', { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), securityGroups: [securityGroup1, securityGroup2], @@ -454,7 +454,7 @@ test('test buildLambdaFunction with lambdaFunctionProps default id', () => { defaults.buildLambdaFunction(stack, { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), } @@ -473,7 +473,7 @@ test('test buildLambdaFunction with lambdaFunctionProps custom id', () => { defaults.buildLambdaFunction(stack, { lambdaFunctionProps: { functionName: 'MyTestFunction', - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(`${__dirname}/lambda`), } diff --git a/source/use_cases/aws-restaurant-management-demo/lib/kitchen-staff-stack.ts b/source/use_cases/aws-restaurant-management-demo/lib/kitchen-staff-stack.ts index 82afed20e..fe225ddba 100644 --- a/source/use_cases/aws-restaurant-management-demo/lib/kitchen-staff-stack.ts +++ b/source/use_cases/aws-restaurant-management-demo/lib/kitchen-staff-stack.ts @@ -40,7 +40,7 @@ export class KitchenStaffStack extends Stack { // Create a Lambda function that lists all open orders in the database const getOpenOrders = new LambdaToDynamoDB(this, 'get-open-orders', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/kitchen-staff/get-open-orders`), handler: 'index.handler', timeout: Duration.seconds(15) @@ -51,7 +51,7 @@ export class KitchenStaffStack extends Stack { // Create a Lambda function that marks an order as completed in the database const completeOrder = new LambdaToDynamoDB(this, 'complete-order', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/kitchen-staff/complete-order`), handler: 'index.handler', timeout: Duration.seconds(15) diff --git a/source/use_cases/aws-restaurant-management-demo/lib/manager-stack.ts b/source/use_cases/aws-restaurant-management-demo/lib/manager-stack.ts index d06f867ad..bff3d948f 100644 --- a/source/use_cases/aws-restaurant-management-demo/lib/manager-stack.ts +++ b/source/use_cases/aws-restaurant-management-demo/lib/manager-stack.ts @@ -48,7 +48,7 @@ export class ManagerStack extends Stack { // Create a Lambda function that lists all orders from the database const getAllOrders = new LambdaToDynamoDB(this, 'get-all-orders', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/manager/get-all-orders`), handler: 'index.handler', timeout: Duration.seconds(15), @@ -61,7 +61,7 @@ export class ManagerStack extends Stack { // Runs as part of the close-out process const createReport = new LambdaToDynamoDB(this, 'create-report', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/manager/create-report`), handler: 'index.handler', timeout: Duration.seconds(15), @@ -79,7 +79,7 @@ export class ManagerStack extends Stack { // Runs as part of the close-out process const calculateTips = new LambdaToDynamoDB(this, 'calculate-tips', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/manager/calculate-tips`), handler: 'index.handler', timeout: Duration.seconds(15), @@ -96,7 +96,7 @@ export class ManagerStack extends Stack { // Runs as part of the close-out process const archiveOrders = new LambdaToDynamoDB(this, 'archive-orders', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/manager/archive-orders`), handler: 'index.handler', timeout: Duration.seconds(15), @@ -133,7 +133,7 @@ export class ManagerStack extends Stack { // 5. Setup the Step Functions integration with Lambda trigger const closeOutService = new LambdaToStepfunctions(this, 'close-out-service', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/manager/close-out-service`), handler: 'index.handler', timeout: Duration.seconds(15) @@ -146,7 +146,7 @@ export class ManagerStack extends Stack { // Create a Lambda function that will retrieve a specific report from the bucket const getReport = new LambdaToS3(this, 'get-report', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/manager/get-report`), handler: 'index.handler', timeout: Duration.seconds(15) @@ -190,7 +190,7 @@ export class ManagerStack extends Stack { // Create a Lambda function for identifying orders that have been open for too long const checkLateOrders = new LambdaToDynamoDB(this, 'check-late-orders', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/manager/check-late-orders`), handler: 'index.handler', environment: { diff --git a/source/use_cases/aws-restaurant-management-demo/lib/service-staff-stack.ts b/source/use_cases/aws-restaurant-management-demo/lib/service-staff-stack.ts index dc921573e..4c8ed887d 100644 --- a/source/use_cases/aws-restaurant-management-demo/lib/service-staff-stack.ts +++ b/source/use_cases/aws-restaurant-management-demo/lib/service-staff-stack.ts @@ -40,7 +40,7 @@ export class ServiceStaffStack extends Stack { // Create a Lambda function that adds a new order to the database const createOrder = new LambdaToDynamoDB(this, 'create-order', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/service-staff/create-order`), handler: 'index.handler', timeout: Duration.seconds(15) @@ -51,7 +51,7 @@ export class ServiceStaffStack extends Stack { // Create a Lambda function that closes out an order in the table const processPayment = new LambdaToDynamoDB(this, 'process-payment', { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_14_X, + runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(`${__dirname}/lambda/service-staff/process-payment`), handler: 'index.handler', timeout: Duration.seconds(15) diff --git a/source/use_cases/aws-restaurant-management-demo/lib/shared-stack.ts b/source/use_cases/aws-restaurant-management-demo/lib/shared-stack.ts index 44d7f7165..ba0409f28 100644 --- a/source/use_cases/aws-restaurant-management-demo/lib/shared-stack.ts +++ b/source/use_cases/aws-restaurant-management-demo/lib/shared-stack.ts @@ -64,7 +64,7 @@ export class SharedStack extends Stack { // Setup a Lambda layer for sharing database functions ------------------------------------------------------------- this.layer = new lambda.LayerVersion(this, 'shared-db-functions-layer', { code: lambda.Code.fromAsset(`${__dirname}/lambda/layer`), - compatibleRuntimes: [ lambda.Runtime.NODEJS_14_X ], + compatibleRuntimes: [ lambda.Runtime.NODEJS_16_X ], license: 'Apache-2.0', description: 'Layer for common database access functions', }); diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.js.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.js.snap index c9180af56..7d030bcb2 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.js.snap +++ b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.js.snap @@ -66,11 +66,10 @@ Object { "S3Bucket": Object { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "079fa35f7c0d6e2edf75f1898bfe1736c1bc0d1da0998ab198dd3a84de7838ae.zip", + "S3Key": "346587a19365916b741034524422c072ee85b4b82a0e01fb28ef8dc62bdb9737.zip", }, "Environment": Object { "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "DDB_TABLE_NAME": Object { "Fn::ImportValue": "SharedStack:ExportsOutputRefordertable80C5609084F626AD", }, @@ -83,7 +82,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Timeout": 15, "TracingConfig": Object { "Mode": "Active", @@ -241,11 +240,10 @@ Object { "S3Bucket": Object { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "f98b1e24e7970579ca20597a3842559584937ff9c6801fdd2e9539838f0fcbae.zip", + "S3Key": "3839faae79dc98cb27aae54e5c7f0c281592853e7fb0f04238098ad02a25952c.zip", }, "Environment": Object { "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "DDB_TABLE_NAME": Object { "Fn::ImportValue": "SharedStack:ExportsOutputRefordertable80C5609084F626AD", }, @@ -258,7 +256,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Timeout": 15, "TracingConfig": Object { "Mode": "Active", @@ -579,7 +577,7 @@ Object { }, }, "Properties": Object { - "Description": "Automatically created by the RestApi construct", + "Description": "Demo: Kitchen staff API", "RestApiId": Object { "Ref": "kitchenstaffapiLambdaRestApiF3F7D4FC", }, diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.ts.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.ts.snap index 8f976be70..0b0094eb5 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.ts.snap +++ b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.ts.snap @@ -130,7 +130,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": Object { "Mode": "Active", }, @@ -846,7 +846,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": Object { "Mode": "Active", }, diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/managerStack.test.js.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/managerStack.test.js.snap deleted file mode 100644 index 4e656c3dd..000000000 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/managerStack.test.js.snap +++ /dev/null @@ -1,2949 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`test-manager-stack 1`] = ` -Object { - "Mappings": Object { - "ServiceprincipalMap": Object { - "af-south-1": Object { - "states": "states.af-south-1.amazonaws.com", - }, - "ap-east-1": Object { - "states": "states.ap-east-1.amazonaws.com", - }, - "ap-northeast-1": Object { - "states": "states.ap-northeast-1.amazonaws.com", - }, - "ap-northeast-2": Object { - "states": "states.ap-northeast-2.amazonaws.com", - }, - "ap-northeast-3": Object { - "states": "states.ap-northeast-3.amazonaws.com", - }, - "ap-south-1": Object { - "states": "states.ap-south-1.amazonaws.com", - }, - "ap-southeast-1": Object { - "states": "states.ap-southeast-1.amazonaws.com", - }, - "ap-southeast-2": Object { - "states": "states.ap-southeast-2.amazonaws.com", - }, - "ap-southeast-3": Object { - "states": "states.ap-southeast-3.amazonaws.com", - }, - "ca-central-1": Object { - "states": "states.ca-central-1.amazonaws.com", - }, - "cn-north-1": Object { - "states": "states.cn-north-1.amazonaws.com", - }, - "cn-northwest-1": Object { - "states": "states.cn-northwest-1.amazonaws.com", - }, - "eu-central-1": Object { - "states": "states.eu-central-1.amazonaws.com", - }, - "eu-north-1": Object { - "states": "states.eu-north-1.amazonaws.com", - }, - "eu-south-1": Object { - "states": "states.eu-south-1.amazonaws.com", - }, - "eu-south-2": Object { - "states": "states.eu-south-2.amazonaws.com", - }, - "eu-west-1": Object { - "states": "states.eu-west-1.amazonaws.com", - }, - "eu-west-2": Object { - "states": "states.eu-west-2.amazonaws.com", - }, - "eu-west-3": Object { - "states": "states.eu-west-3.amazonaws.com", - }, - "me-south-1": Object { - "states": "states.me-south-1.amazonaws.com", - }, - "sa-east-1": Object { - "states": "states.sa-east-1.amazonaws.com", - }, - "us-east-1": Object { - "states": "states.us-east-1.amazonaws.com", - }, - "us-east-2": Object { - "states": "states.us-east-2.amazonaws.com", - }, - "us-gov-east-1": Object { - "states": "states.us-gov-east-1.amazonaws.com", - }, - "us-gov-west-1": Object { - "states": "states.us-gov-west-1.amazonaws.com", - }, - "us-iso-east-1": Object { - "states": "states.amazonaws.com", - }, - "us-iso-west-1": Object { - "states": "states.amazonaws.com", - }, - "us-isob-east-1": Object { - "states": "states.amazonaws.com", - }, - "us-west-1": Object { - "states": "states.us-west-1.amazonaws.com", - }, - "us-west-2": Object { - "states": "states.us-west-2.amazonaws.com", - }, - }, - }, - "Outputs": Object { - "managerapiLambdaRestApiEndpointD1A41897": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".", - Object { - "Ref": "AWS::URLSuffix", - }, - "/", - Object { - "Ref": "managerapiLambdaRestApiDeploymentStageprod59C4A8D4", - }, - "/", - ], - ], - }, - }, - }, - "Parameters": Object { - "BootstrapVersion": Object { - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", - "Type": "AWS::SSM::Parameter::Value", - }, - }, - "Resources": Object { - "archiveordersLambdaFunction66659E04": Object { - "DependsOn": Array [ - "archiveordersLambdaFunctionServiceRoleDefaultPolicyDB67FB52", - "archiveordersLambdaFunctionServiceRoleE513ACF7", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "73c9c006378719da4f26edf58d76e55f540b26e5cece3e2fc200ff06d275a640.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefordertable80C5609084F626AD", - }, - "S3_BUCKET_NAME": Object { - "Fn::ImportValue": "ExistingResourcesStack:ExportsOutputRefexistingorderarchivebucket95AB7C994BD2255B", - }, - }, - }, - "Handler": "index.handler", - "Layers": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefshareddbfunctionslayerA9CFEC5A89EBE406", - }, - ], - "Role": Object { - "Fn::GetAtt": Array [ - "archiveordersLambdaFunctionServiceRoleE513ACF7", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "Timeout": 15, - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "archiveordersLambdaFunctionServiceRoleDefaultPolicyDB67FB52": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - "/index/*", - ], - ], - }, - ], - }, - Object { - "Action": Array [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "ExistingResourcesStack:ExportsOutputFnGetAttexistingorderarchivebucket95AB7C99Arn7A4BF717", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "ExistingResourcesStack:ExportsOutputFnGetAttexistingorderarchivebucket95AB7C99Arn7A4BF717", - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "archiveordersLambdaFunctionServiceRoleDefaultPolicyDB67FB52", - "Roles": Array [ - Object { - "Ref": "archiveordersLambdaFunctionServiceRoleE513ACF7", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "archiveordersLambdaFunctionServiceRoleE513ACF7": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "calculatetipsLambdaFunction9F2FE033": Object { - "DependsOn": Array [ - "calculatetipsLambdaFunctionServiceRoleDefaultPolicyED27C928", - "calculatetipsLambdaFunctionServiceRoleDE97A87F", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "a78138ba38105bdfdb6b752c4aa5199e2394cd4c43f0a063a7fcd06d04aa7554.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefordertable80C5609084F626AD", - }, - "SNS_TOPIC_ARN": Object { - "Ref": "calculatetipstopicSnsTopicD7FACC9C", - }, - "SNS_TOPIC_NAME": Object { - "Fn::GetAtt": Array [ - "calculatetipstopicSnsTopicD7FACC9C", - "TopicName", - ], - }, - }, - }, - "Handler": "index.handler", - "Layers": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefshareddbfunctionslayerA9CFEC5A89EBE406", - }, - ], - "Role": Object { - "Fn::GetAtt": Array [ - "calculatetipsLambdaFunctionServiceRoleDE97A87F", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "Timeout": 15, - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "calculatetipsLambdaFunctionServiceRoleDE97A87F": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "calculatetipsLambdaFunctionServiceRoleDefaultPolicyED27C928": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - "/index/*", - ], - ], - }, - ], - }, - Object { - "Action": "sns:Publish", - "Effect": "Allow", - "Resource": Object { - "Ref": "calculatetipstopicSnsTopicD7FACC9C", - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "calculatetipsLambdaFunctionServiceRoleDefaultPolicyED27C928", - "Roles": Array [ - Object { - "Ref": "calculatetipsLambdaFunctionServiceRoleDE97A87F", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "calculatetipstopicSnsTopicD7FACC9C": Object { - "Properties": Object { - "KmsMasterKeyId": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":kms:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":alias/aws/sns", - ], - ], - }, - }, - "Type": "AWS::SNS::Topic", - }, - "calculatetipstopicSnsTopicPolicy529CD9C3": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "SNS:Publish", - "SNS:RemovePermission", - "SNS:SetTopicAttributes", - "SNS:DeleteTopic", - "SNS:ListSubscriptionsByTopic", - "SNS:GetTopicAttributes", - "SNS:Receive", - "SNS:AddPermission", - "SNS:Subscribe", - ], - "Condition": Object { - "StringEquals": Object { - "AWS:SourceOwner": Object { - "Ref": "AWS::AccountId", - }, - }, - }, - "Effect": "Allow", - "Principal": Object { - "AWS": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::", - Object { - "Ref": "AWS::AccountId", - }, - ":root", - ], - ], - }, - }, - "Resource": Object { - "Ref": "calculatetipstopicSnsTopicD7FACC9C", - }, - "Sid": "TopicOwnerOnlyAccess", - }, - Object { - "Action": Array [ - "SNS:Publish", - "SNS:RemovePermission", - "SNS:SetTopicAttributes", - "SNS:DeleteTopic", - "SNS:ListSubscriptionsByTopic", - "SNS:GetTopicAttributes", - "SNS:Receive", - "SNS:AddPermission", - "SNS:Subscribe", - ], - "Condition": Object { - "Bool": Object { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": Object { - "AWS": "*", - }, - "Resource": Object { - "Ref": "calculatetipstopicSnsTopicD7FACC9C", - }, - "Sid": "HttpsOnly", - }, - ], - "Version": "2012-10-17", - }, - "Topics": Array [ - Object { - "Ref": "calculatetipstopicSnsTopicD7FACC9C", - }, - ], - }, - "Type": "AWS::SNS::TopicPolicy", - }, - "checklateordersLambdaFunctionAwsEventsLambdaInvokePermission124C4D337": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "checklateordersLambdaFunctionB46EDA7D", - "Arn", - ], - }, - "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ - "checklateordersschedulerchecklateordersschedulerWEventsRule15B31DCC", - "Arn", - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "checklateordersLambdaFunctionB46EDA7D": Object { - "DependsOn": Array [ - "checklateordersLambdaFunctionServiceRoleDefaultPolicy4DABEECE", - "checklateordersLambdaFunctionServiceRoleA8F250A0", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "163bafdf2e5906a01cacb85564564cb04ba056e69bc9cdef9c5f046760bbf5e6.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefordertable80C5609084F626AD", - }, - "LATE_ORDER_THRESHOLD": "30", - "SNS_TOPIC_ARN": Object { - "Ref": "checklateordersnotifierSnsTopic2055CAD8", - }, - "SNS_TOPIC_NAME": Object { - "Fn::GetAtt": Array [ - "checklateordersnotifierSnsTopic2055CAD8", - "TopicName", - ], - }, - }, - }, - "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ - "checklateordersLambdaFunctionServiceRoleA8F250A0", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "Timeout": 15, - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "checklateordersLambdaFunctionServiceRoleA8F250A0": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "checklateordersLambdaFunctionServiceRoleDefaultPolicy4DABEECE": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - "/index/*", - ], - ], - }, - ], - }, - Object { - "Action": "sns:Publish", - "Effect": "Allow", - "Resource": Object { - "Ref": "checklateordersnotifierSnsTopic2055CAD8", - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "checklateordersLambdaFunctionServiceRoleDefaultPolicy4DABEECE", - "Roles": Array [ - Object { - "Ref": "checklateordersLambdaFunctionServiceRoleA8F250A0", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "checklateordersnotifierSnsTopic2055CAD8": Object { - "Properties": Object { - "KmsMasterKeyId": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":kms:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":alias/aws/sns", - ], - ], - }, - }, - "Type": "AWS::SNS::Topic", - }, - "checklateordersnotifierSnsTopicPolicyCF0A65E0": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "SNS:Publish", - "SNS:RemovePermission", - "SNS:SetTopicAttributes", - "SNS:DeleteTopic", - "SNS:ListSubscriptionsByTopic", - "SNS:GetTopicAttributes", - "SNS:Receive", - "SNS:AddPermission", - "SNS:Subscribe", - ], - "Condition": Object { - "StringEquals": Object { - "AWS:SourceOwner": Object { - "Ref": "AWS::AccountId", - }, - }, - }, - "Effect": "Allow", - "Principal": Object { - "AWS": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::", - Object { - "Ref": "AWS::AccountId", - }, - ":root", - ], - ], - }, - }, - "Resource": Object { - "Ref": "checklateordersnotifierSnsTopic2055CAD8", - }, - "Sid": "TopicOwnerOnlyAccess", - }, - Object { - "Action": Array [ - "SNS:Publish", - "SNS:RemovePermission", - "SNS:SetTopicAttributes", - "SNS:DeleteTopic", - "SNS:ListSubscriptionsByTopic", - "SNS:GetTopicAttributes", - "SNS:Receive", - "SNS:AddPermission", - "SNS:Subscribe", - ], - "Condition": Object { - "Bool": Object { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": Object { - "AWS": "*", - }, - "Resource": Object { - "Ref": "checklateordersnotifierSnsTopic2055CAD8", - }, - "Sid": "HttpsOnly", - }, - ], - "Version": "2012-10-17", - }, - "Topics": Array [ - Object { - "Ref": "checklateordersnotifierSnsTopic2055CAD8", - }, - ], - }, - "Type": "AWS::SNS::TopicPolicy", - }, - "checklateordersschedulerchecklateordersschedulerWEventsRule15B31DCC": Object { - "Properties": Object { - "ScheduleExpression": "rate(1 minute)", - "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ - "checklateordersLambdaFunctionB46EDA7D", - "Arn", - ], - }, - "Id": "Target0", - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "closeoutserviceExecutionAbortedAlarm861B143E": Object { - "Properties": Object { - "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "Dimensions": Array [ - Object { - "Name": "StateMachineArn", - "Value": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - ], - "EvaluationPeriods": 1, - "MetricName": "ExecutionsAborted", - "Namespace": "AWS/States", - "Period": 300, - "Statistic": "Maximum", - "Threshold": 1, - }, - "Type": "AWS::CloudWatch::Alarm", - }, - "closeoutserviceExecutionFailedAlarm7495D8BE": Object { - "Properties": Object { - "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "Dimensions": Array [ - Object { - "Name": "StateMachineArn", - "Value": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - ], - "EvaluationPeriods": 1, - "MetricName": "ExecutionsFailed", - "Namespace": "AWS/States", - "Period": 300, - "Statistic": "Sum", - "Threshold": 1, - }, - "Type": "AWS::CloudWatch::Alarm", - }, - "closeoutserviceExecutionThrottledAlarmC5A6E612": Object { - "Properties": Object { - "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "Dimensions": Array [ - Object { - "Name": "StateMachineArn", - "Value": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - ], - "EvaluationPeriods": 1, - "MetricName": "ExecutionThrottled", - "Namespace": "AWS/States", - "Period": 300, - "Statistic": "Sum", - "Threshold": 1, - }, - "Type": "AWS::CloudWatch::Alarm", - }, - "closeoutserviceLambdaFunction684B26D3": Object { - "DependsOn": Array [ - "closeoutserviceLambdaFunctionServiceRoleDefaultPolicy95A79CC3", - "closeoutserviceLambdaFunctionServiceRoleB49E9696", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "ef2ccd579ef102f993897bc1e5a05c9794586030557c38d080d7a5362c3c0fea.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "STATE_MACHINE_ARN": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - }, - "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ - "closeoutserviceLambdaFunctionServiceRoleB49E9696", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "Timeout": 15, - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "closeoutserviceLambdaFunctionServiceRoleB49E9696": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "closeoutserviceLambdaFunctionServiceRoleDefaultPolicy95A79CC3": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": "states:StartExecution", - "Effect": "Allow", - "Resource": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "closeoutserviceLambdaFunctionServiceRoleDefaultPolicy95A79CC3", - "Roles": Array [ - Object { - "Ref": "closeoutserviceLambdaFunctionServiceRoleB49E9696", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "closeoutserviceStateMachineC9DD68A8": Object { - "DependsOn": Array [ - "closeoutserviceStateMachineRoleDefaultPolicy5F05BEB8", - "closeoutserviceStateMachineRoleCA7F9A09", - ], - "Properties": Object { - "DefinitionString": Object { - "Fn::Join": Array [ - "", - Array [ - "{\\"StartAt\\":\\"create-reports-task\\",\\"States\\":{\\"create-reports-task\\":{\\"Next\\":\\"calculate-tips-task\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", - Object { - "Ref": "AWS::Partition", - }, - ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", - Object { - "Fn::GetAtt": Array [ - "createreportLambdaFunctionB37EBE52", - "Arn", - ], - }, - "\\",\\"Payload.$\\":\\"$\\"}},\\"calculate-tips-task\\":{\\"Next\\":\\"archive-orders-task\\",\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", - Object { - "Ref": "AWS::Partition", - }, - ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", - Object { - "Fn::GetAtt": Array [ - "calculatetipsLambdaFunction9F2FE033", - "Arn", - ], - }, - "\\",\\"Payload.$\\":\\"$\\"}},\\"archive-orders-task\\":{\\"End\\":true,\\"Retry\\":[{\\"ErrorEquals\\":[\\"Lambda.ServiceException\\",\\"Lambda.AWSLambdaException\\",\\"Lambda.SdkClientException\\"],\\"IntervalSeconds\\":2,\\"MaxAttempts\\":6,\\"BackoffRate\\":2}],\\"Type\\":\\"Task\\",\\"Resource\\":\\"arn:", - Object { - "Ref": "AWS::Partition", - }, - ":states:::lambda:invoke\\",\\"Parameters\\":{\\"FunctionName\\":\\"", - Object { - "Fn::GetAtt": Array [ - "archiveordersLambdaFunction66659E04", - "Arn", - ], - }, - "\\",\\"Payload.$\\":\\"$\\"}}}}", - ], - ], - }, - "LoggingConfiguration": Object { - "Destinations": Array [ - Object { - "CloudWatchLogsLogGroup": Object { - "LogGroupArn": Object { - "Fn::GetAtt": Array [ - "closeoutserviceStateMachineLogGroup56CA2C8F", - "Arn", - ], - }, - }, - }, - ], - "Level": "ERROR", - }, - "RoleArn": Object { - "Fn::GetAtt": Array [ - "closeoutserviceStateMachineRoleCA7F9A09", - "Arn", - ], - }, - }, - "Type": "AWS::StepFunctions::StateMachine", - }, - "closeoutserviceStateMachineLogGroup56CA2C8F": Object { - "DeletionPolicy": "Retain", - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely", - }, - Object { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)", - }, - ], - }, - }, - "Properties": Object { - "LogGroupName": "/aws/vendedlogs/states/managerstackcloseoutservicestatemachinelog5da3d5b2d585", - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - }, - "closeoutserviceStateMachineRoleCA7F9A09": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": Object { - "Fn::FindInMap": Array [ - "ServiceprincipalMap", - Object { - "Ref": "AWS::Region", - }, - "states", - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "closeoutserviceStateMachineRoleDefaultPolicy5F05BEB8": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "The 'LogDelivery' actions do not support resource-level authorizations", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogDelivery", - "logs:GetLogDelivery", - "logs:UpdateLogDelivery", - "logs:DeleteLogDelivery", - "logs:ListLogDeliveries", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": "lambda:InvokeFunction", - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "createreportLambdaFunctionB37EBE52", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "createreportLambdaFunctionB37EBE52", - "Arn", - ], - }, - ":*", - ], - ], - }, - ], - }, - Object { - "Action": "lambda:InvokeFunction", - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "calculatetipsLambdaFunction9F2FE033", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "calculatetipsLambdaFunction9F2FE033", - "Arn", - ], - }, - ":*", - ], - ], - }, - ], - }, - Object { - "Action": "lambda:InvokeFunction", - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "archiveordersLambdaFunction66659E04", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "archiveordersLambdaFunction66659E04", - "Arn", - ], - }, - ":*", - ], - ], - }, - ], - }, - Object { - "Action": Array [ - "logs:PutResourcePolicy", - "logs:DescribeResourcePolicies", - "logs:DescribeLogGroups", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "closeoutserviceStateMachineRoleDefaultPolicy5F05BEB8", - "Roles": Array [ - Object { - "Ref": "closeoutserviceStateMachineRoleCA7F9A09", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "createreportLambdaFunctionB37EBE52": Object { - "DependsOn": Array [ - "createreportLambdaFunctionServiceRoleDefaultPolicy5A317B6C", - "createreportLambdaFunctionServiceRole33C78256", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e8b34645be63aee518b14819c57483ed3803320717ead9b7622042b7776d8321.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefordertable80C5609084F626AD", - }, - "S3_BUCKET_NAME": Object { - "Ref": "reportsbucketS3BucketCC334898", - }, - }, - }, - "Handler": "index.handler", - "Layers": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefshareddbfunctionslayerA9CFEC5A89EBE406", - }, - ], - "Role": Object { - "Fn::GetAtt": Array [ - "createreportLambdaFunctionServiceRole33C78256", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "Timeout": 15, - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "createreportLambdaFunctionServiceRole33C78256": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "createreportLambdaFunctionServiceRoleDefaultPolicy5A317B6C": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - "/index/*", - ], - ], - }, - ], - }, - Object { - "Action": Array [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "createreportLambdaFunctionServiceRoleDefaultPolicy5A317B6C", - "Roles": Array [ - Object { - "Ref": "createreportLambdaFunctionServiceRole33C78256", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "getallordersLambdaFunctionFEF65B05": Object { - "DependsOn": Array [ - "getallordersLambdaFunctionServiceRoleDefaultPolicy705A0D9A", - "getallordersLambdaFunctionServiceRole8AF6EF71", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "bbc65a0fb678fc99f63770d2e627e3e013d7688bef90acea02cccae8c50b2fc8.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefordertable80C5609084F626AD", - }, - }, - }, - "Handler": "index.handler", - "Layers": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefshareddbfunctionslayerA9CFEC5A89EBE406", - }, - ], - "Role": Object { - "Fn::GetAtt": Array [ - "getallordersLambdaFunctionServiceRole8AF6EF71", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "Timeout": 15, - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "getallordersLambdaFunctionServiceRole8AF6EF71": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "getallordersLambdaFunctionServiceRoleDefaultPolicy705A0D9A": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttordertable80C56090ArnFF5A50B5", - }, - "/index/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "getallordersLambdaFunctionServiceRoleDefaultPolicy705A0D9A", - "Roles": Array [ - Object { - "Ref": "getallordersLambdaFunctionServiceRole8AF6EF71", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "getreportLambdaFunction2A26EACE": Object { - "DependsOn": Array [ - "getreportLambdaFunctionServiceRoleDefaultPolicy0A75937B", - "getreportLambdaFunctionServiceRole39064368", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b8c4071c2fc7ca40b1fe68986299039a4c0f6d7dc9d680c88ac619439f34ab04.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "S3_BUCKET_NAME": Object { - "Ref": "reportsbucketS3BucketCC334898", - }, - }, - }, - "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ - "getreportLambdaFunctionServiceRole39064368", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "Timeout": 15, - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "getreportLambdaFunctionServiceRole39064368": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "getreportLambdaFunctionServiceRoleDefaultPolicy0A75937B": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "getreportLambdaFunctionServiceRoleDefaultPolicy0A75937B", - "Roles": Array [ - Object { - "Ref": "getreportLambdaFunctionServiceRole39064368", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "managerapiApiAccessLogGroup35F9537B": Object { - "DeletionPolicy": "Retain", - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely", - }, - Object { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)", - }, - ], - }, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - }, - "managerapiCognitoAuthorizer5745AF8D": Object { - "Properties": Object { - "IdentitySource": "method.request.header.Authorization", - "Name": "authorizer", - "ProviderARNs": Array [ - Object { - "Fn::GetAtt": Array [ - "managerapiCognitoUserPool03946196", - "Arn", - ], - }, - ], - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "Type": "COGNITO_USER_POOLS", - }, - "Type": "AWS::ApiGateway::Authorizer", - }, - "managerapiCognitoUserPool03946196": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AccountRecoverySetting": Object { - "RecoveryMechanisms": Array [ - Object { - "Name": "verified_phone_number", - "Priority": 1, - }, - Object { - "Name": "verified_email", - "Priority": 2, - }, - ], - }, - "AdminCreateUserConfig": Object { - "AllowAdminCreateUserOnly": true, - }, - "EmailVerificationMessage": "The verification code to your new account is {####}", - "EmailVerificationSubject": "Verify your new account", - "SmsVerificationMessage": "The verification code to your new account is {####}", - "UserPoolAddOns": Object { - "AdvancedSecurityMode": "ENFORCED", - }, - "VerificationMessageTemplate": Object { - "DefaultEmailOption": "CONFIRM_WITH_CODE", - "EmailMessage": "The verification code to your new account is {####}", - "EmailSubject": "Verify your new account", - "SmsMessage": "The verification code to your new account is {####}", - }, - }, - "Type": "AWS::Cognito::UserPool", - "UpdateReplacePolicy": "Retain", - }, - "managerapiCognitoUserPoolClientB3BC933D": Object { - "Properties": Object { - "AllowedOAuthFlows": Array [ - "implicit", - "code", - ], - "AllowedOAuthFlowsUserPoolClient": true, - "AllowedOAuthScopes": Array [ - "profile", - "phone", - "email", - "openid", - "aws.cognito.signin.user.admin", - ], - "CallbackURLs": Array [ - "https://example.com", - ], - "SupportedIdentityProviders": Array [ - "COGNITO", - ], - "UserPoolId": Object { - "Ref": "managerapiCognitoUserPool03946196", - }, - }, - "Type": "AWS::Cognito::UserPoolClient", - }, - "managerapiLambdaRestApi62BEEAC7": Object { - "Properties": Object { - "Description": "Demo: Manager API", - "EndpointConfiguration": Object { - "Types": Array [ - "EDGE", - ], - }, - "Name": "LambdaRestApi", - }, - "Type": "AWS::ApiGateway::RestApi", - }, - "managerapiLambdaRestApiAccount350A78F5": Object { - "DependsOn": Array [ - "managerapiLambdaRestApi62BEEAC7", - ], - "Properties": Object { - "CloudWatchRoleArn": Object { - "Fn::GetAtt": Array [ - "managerapiLambdaRestApiCloudWatchRole43F48235", - "Arn", - ], - }, - }, - "Type": "AWS::ApiGateway::Account", - }, - "managerapiLambdaRestApiCloudWatchRole43F48235": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "apigateway.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:DescribeLogGroups", - "logs:DescribeLogStreams", - "logs:PutLogEvents", - "logs:GetLogEvents", - "logs:FilterLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaRestApiCloudWatchRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "managerapiLambdaRestApiDeployment719D102Abf8fc62f0a59aea37747b68fec60f4a4": Object { - "DependsOn": Array [ - "managerapiLambdaRestApicloseoutserviceproxyANY182BEB46", - "managerapiLambdaRestApicloseoutserviceproxyECAF0FA1", - "managerapiLambdaRestApicloseoutservice2D3987E6", - "managerapiLambdaRestApigetallordersproxyANYEAB740ED", - "managerapiLambdaRestApigetallordersproxyEE336136", - "managerapiLambdaRestApigetallorders29C83FB0", - "managerapiLambdaRestApigetreportproxyANY93C7142D", - "managerapiLambdaRestApigetreportproxy2FB66C91", - "managerapiLambdaRestApigetreportDB310438", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource", - }, - ], - }, - }, - "Properties": Object { - "Description": "Automatically created by the RestApi construct", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Deployment", - }, - "managerapiLambdaRestApiDeploymentStageprod59C4A8D4": Object { - "Properties": Object { - "AccessLogSetting": Object { - "DestinationArn": Object { - "Fn::GetAtt": Array [ - "managerapiApiAccessLogGroup35F9537B", - "Arn", - ], - }, - "Format": "{\\"requestId\\":\\"$context.requestId\\",\\"ip\\":\\"$context.identity.sourceIp\\",\\"user\\":\\"$context.identity.user\\",\\"caller\\":\\"$context.identity.caller\\",\\"requestTime\\":\\"$context.requestTime\\",\\"httpMethod\\":\\"$context.httpMethod\\",\\"resourcePath\\":\\"$context.resourcePath\\",\\"status\\":\\"$context.status\\",\\"protocol\\":\\"$context.protocol\\",\\"responseLength\\":\\"$context.responseLength\\"}", - }, - "DeploymentId": Object { - "Ref": "managerapiLambdaRestApiDeployment719D102Abf8fc62f0a59aea37747b68fec60f4a4", - }, - "MethodSettings": Array [ - Object { - "DataTraceEnabled": false, - "HttpMethod": "*", - "LoggingLevel": "INFO", - "ResourcePath": "/*", - }, - ], - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "StageName": "prod", - "TracingEnabled": true, - }, - "Type": "AWS::ApiGateway::Stage", - }, - "managerapiLambdaRestApiUsagePlanF10CE619": Object { - "Properties": Object { - "ApiStages": Array [ - Object { - "ApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "Stage": Object { - "Ref": "managerapiLambdaRestApiDeploymentStageprod59C4A8D4", - }, - "Throttle": Object {}, - }, - ], - }, - "Type": "AWS::ApiGateway::UsagePlan", - }, - "managerapiLambdaRestApicloseoutservice2D3987E6": Object { - "Properties": Object { - "ParentId": Object { - "Fn::GetAtt": Array [ - "managerapiLambdaRestApi62BEEAC7", - "RootResourceId", - ], - }, - "PathPart": "close-out-service", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApicloseoutserviceproxyANY182BEB46": Object { - "Properties": Object { - "AuthorizationType": "COGNITO_USER_POOLS", - "AuthorizerId": Object { - "Ref": "managerapiCognitoAuthorizer5745AF8D", - }, - "HttpMethod": "ANY", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "closeoutserviceLambdaFunction684B26D3", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "ResourceId": Object { - "Ref": "managerapiLambdaRestApicloseoutserviceproxyECAF0FA1", - }, - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "managerapiLambdaRestApicloseoutserviceproxyANYApiPermissionManagerStackmanagerapiLambdaRestApi386CA826ANYcloseoutserviceproxy132F7E1D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "closeoutserviceLambdaFunction684B26D3", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/", - Object { - "Ref": "managerapiLambdaRestApiDeploymentStageprod59C4A8D4", - }, - "/*/close-out-service/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "managerapiLambdaRestApicloseoutserviceproxyANYApiPermissionTestManagerStackmanagerapiLambdaRestApi386CA826ANYcloseoutserviceproxy8A25C882": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "closeoutserviceLambdaFunction684B26D3", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/test-invoke-stage/*/close-out-service/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "managerapiLambdaRestApicloseoutserviceproxyECAF0FA1": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "managerapiLambdaRestApicloseoutservice2D3987E6", - }, - "PathPart": "{proxy+}", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApigetallorders29C83FB0": Object { - "Properties": Object { - "ParentId": Object { - "Fn::GetAtt": Array [ - "managerapiLambdaRestApi62BEEAC7", - "RootResourceId", - ], - }, - "PathPart": "get-all-orders", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApigetallordersproxyANYApiPermissionManagerStackmanagerapiLambdaRestApi386CA826ANYgetallordersproxy57374F7E": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "getallordersLambdaFunctionFEF65B05", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/", - Object { - "Ref": "managerapiLambdaRestApiDeploymentStageprod59C4A8D4", - }, - "/*/get-all-orders/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "managerapiLambdaRestApigetallordersproxyANYApiPermissionTestManagerStackmanagerapiLambdaRestApi386CA826ANYgetallordersproxy45104276": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "getallordersLambdaFunctionFEF65B05", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/test-invoke-stage/*/get-all-orders/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "managerapiLambdaRestApigetallordersproxyANYEAB740ED": Object { - "Properties": Object { - "AuthorizationType": "COGNITO_USER_POOLS", - "AuthorizerId": Object { - "Ref": "managerapiCognitoAuthorizer5745AF8D", - }, - "HttpMethod": "ANY", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "getallordersLambdaFunctionFEF65B05", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "ResourceId": Object { - "Ref": "managerapiLambdaRestApigetallordersproxyEE336136", - }, - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "managerapiLambdaRestApigetallordersproxyEE336136": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "managerapiLambdaRestApigetallorders29C83FB0", - }, - "PathPart": "{proxy+}", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApigetreportDB310438": Object { - "Properties": Object { - "ParentId": Object { - "Fn::GetAtt": Array [ - "managerapiLambdaRestApi62BEEAC7", - "RootResourceId", - ], - }, - "PathPart": "get-report", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApigetreportproxy2FB66C91": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "managerapiLambdaRestApigetreportDB310438", - }, - "PathPart": "{proxy+}", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApigetreportproxyANY93C7142D": Object { - "Properties": Object { - "AuthorizationType": "COGNITO_USER_POOLS", - "AuthorizerId": Object { - "Ref": "managerapiCognitoAuthorizer5745AF8D", - }, - "HttpMethod": "ANY", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "getreportLambdaFunction2A26EACE", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "ResourceId": Object { - "Ref": "managerapiLambdaRestApigetreportproxy2FB66C91", - }, - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "managerapiLambdaRestApigetreportproxyANYApiPermissionManagerStackmanagerapiLambdaRestApi386CA826ANYgetreportproxy80B2B901": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "getreportLambdaFunction2A26EACE", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/", - Object { - "Ref": "managerapiLambdaRestApiDeploymentStageprod59C4A8D4", - }, - "/*/get-report/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "managerapiLambdaRestApigetreportproxyANYApiPermissionTestManagerStackmanagerapiLambdaRestApi386CA826ANYgetreportproxy7868B7DA": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "getreportLambdaFunction2A26EACE", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/test-invoke-stage/*/get-report/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "reportsbucketS3BucketCC334898": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "BucketEncryption": Object { - "ServerSideEncryptionConfiguration": Array [ - Object { - "ServerSideEncryptionByDefault": Object { - "SSEAlgorithm": "AES256", - }, - }, - ], - }, - "LifecycleConfiguration": Object { - "Rules": Array [ - Object { - "NoncurrentVersionTransitions": Array [ - Object { - "StorageClass": "GLACIER", - "TransitionInDays": 90, - }, - ], - "Status": "Enabled", - }, - ], - }, - "LoggingConfiguration": Object { - "DestinationBucketName": Object { - "Ref": "reportsbucketS3LoggingBucket088F7E0E", - }, - }, - "PublicAccessBlockConfiguration": Object { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true, - }, - "VersioningConfiguration": Object { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Retain", - }, - "reportsbucketS3BucketPolicyCF9C1527": Object { - "Properties": Object { - "Bucket": Object { - "Ref": "reportsbucketS3BucketCC334898", - }, - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "s3:*", - "Condition": Object { - "Bool": Object { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": Object { - "AWS": "*", - }, - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "reportsbucketS3LoggingBucket088F7E0E": Object { - "DeletionPolicy": "Retain", - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W35", - "reason": "This S3 bucket is used as the access logging bucket for another bucket", - }, - ], - }, - }, - "Properties": Object { - "AccessControl": "LogDeliveryWrite", - "BucketEncryption": Object { - "ServerSideEncryptionConfiguration": Array [ - Object { - "ServerSideEncryptionByDefault": Object { - "SSEAlgorithm": "AES256", - }, - }, - ], - }, - "PublicAccessBlockConfiguration": Object { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true, - }, - "VersioningConfiguration": Object { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Retain", - }, - "reportsbucketS3LoggingBucketPolicy82A7D267": Object { - "Properties": Object { - "Bucket": Object { - "Ref": "reportsbucketS3LoggingBucket088F7E0E", - }, - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "s3:*", - "Condition": Object { - "Bool": Object { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": Object { - "AWS": "*", - }, - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3LoggingBucket088F7E0E", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3LoggingBucket088F7E0E", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ - "1", - "2", - "3", - "4", - "5", - ], - Object { - "Ref": "BootstrapVersion", - }, - ], - }, - ], - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", - }, - ], - }, - }, -} -`; diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/managerStack.test.ts.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/managerStack.test.ts.snap deleted file mode 100644 index 21877ce27..000000000 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/managerStack.test.ts.snap +++ /dev/null @@ -1,2654 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`test-manager-stack 1`] = ` -Object { - "Outputs": Object { - "managerapiLambdaRestApiEndpointD1A41897": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - ".execute-api.us-east-1.", - Object { - "Ref": "AWS::URLSuffix", - }, - "/", - Object { - "Ref": "managerapiLambdaRestApiDeploymentStageprod59C4A8D4", - }, - "/", - ], - ], - }, - }, - }, - "Parameters": Object { - "AssetParameters082c093d0decaeaf11ada975331e1e2e077c188737c9c1672ca3dac35a434cf2ArtifactHashCAFDB577": Object { - "Description": "Artifact hash for asset \\"082c093d0decaeaf11ada975331e1e2e077c188737c9c1672ca3dac35a434cf2\\"", - "Type": "String", - }, - "AssetParameters082c093d0decaeaf11ada975331e1e2e077c188737c9c1672ca3dac35a434cf2S3Bucket2D3D7D82": Object { - "Description": "S3 bucket for asset \\"082c093d0decaeaf11ada975331e1e2e077c188737c9c1672ca3dac35a434cf2\\"", - "Type": "String", - }, - "AssetParameters082c093d0decaeaf11ada975331e1e2e077c188737c9c1672ca3dac35a434cf2S3VersionKey882A94CB": Object { - "Description": "S3 key for asset version \\"082c093d0decaeaf11ada975331e1e2e077c188737c9c1672ca3dac35a434cf2\\"", - "Type": "String", - }, - "AssetParameters2f0da58e411ab6b0549e6ad40bf1c54171752a646b89e453c5c3803ff20c254cArtifactHash04148482": Object { - "Description": "Artifact hash for asset \\"2f0da58e411ab6b0549e6ad40bf1c54171752a646b89e453c5c3803ff20c254c\\"", - "Type": "String", - }, - "AssetParameters2f0da58e411ab6b0549e6ad40bf1c54171752a646b89e453c5c3803ff20c254cS3Bucket1B8C7DD7": Object { - "Description": "S3 bucket for asset \\"2f0da58e411ab6b0549e6ad40bf1c54171752a646b89e453c5c3803ff20c254c\\"", - "Type": "String", - }, - "AssetParameters2f0da58e411ab6b0549e6ad40bf1c54171752a646b89e453c5c3803ff20c254cS3VersionKey6C2FB92E": Object { - "Description": "S3 key for asset version \\"2f0da58e411ab6b0549e6ad40bf1c54171752a646b89e453c5c3803ff20c254c\\"", - "Type": "String", - }, - "AssetParameters3579f3ba4ed0a2e2a89e25a539f1b17dc8fe7d795e0e4cd6e93d875c48f3ecfbArtifactHash4C9AF59C": Object { - "Description": "Artifact hash for asset \\"3579f3ba4ed0a2e2a89e25a539f1b17dc8fe7d795e0e4cd6e93d875c48f3ecfb\\"", - "Type": "String", - }, - "AssetParameters3579f3ba4ed0a2e2a89e25a539f1b17dc8fe7d795e0e4cd6e93d875c48f3ecfbS3Bucket9ED6F329": Object { - "Description": "S3 bucket for asset \\"3579f3ba4ed0a2e2a89e25a539f1b17dc8fe7d795e0e4cd6e93d875c48f3ecfb\\"", - "Type": "String", - }, - "AssetParameters3579f3ba4ed0a2e2a89e25a539f1b17dc8fe7d795e0e4cd6e93d875c48f3ecfbS3VersionKey32CA5343": Object { - "Description": "S3 key for asset version \\"3579f3ba4ed0a2e2a89e25a539f1b17dc8fe7d795e0e4cd6e93d875c48f3ecfb\\"", - "Type": "String", - }, - "AssetParameters5dc0666f057bc99738d8505d74a8f25576fc501d98f95ea7e69b36b3a7dd6ad1ArtifactHash152A2A15": Object { - "Description": "Artifact hash for asset \\"5dc0666f057bc99738d8505d74a8f25576fc501d98f95ea7e69b36b3a7dd6ad1\\"", - "Type": "String", - }, - "AssetParameters5dc0666f057bc99738d8505d74a8f25576fc501d98f95ea7e69b36b3a7dd6ad1S3BucketF5B31E9E": Object { - "Description": "S3 bucket for asset \\"5dc0666f057bc99738d8505d74a8f25576fc501d98f95ea7e69b36b3a7dd6ad1\\"", - "Type": "String", - }, - "AssetParameters5dc0666f057bc99738d8505d74a8f25576fc501d98f95ea7e69b36b3a7dd6ad1S3VersionKey4A579976": Object { - "Description": "S3 key for asset version \\"5dc0666f057bc99738d8505d74a8f25576fc501d98f95ea7e69b36b3a7dd6ad1\\"", - "Type": "String", - }, - "AssetParametersc82a6fa188f5986a76f5d3bc6ddbcf1647ce70fd9411698e1d8d694ea91f688aArtifactHash84A7F12F": Object { - "Description": "Artifact hash for asset \\"c82a6fa188f5986a76f5d3bc6ddbcf1647ce70fd9411698e1d8d694ea91f688a\\"", - "Type": "String", - }, - "AssetParametersc82a6fa188f5986a76f5d3bc6ddbcf1647ce70fd9411698e1d8d694ea91f688aS3BucketD8C1F551": Object { - "Description": "S3 bucket for asset \\"c82a6fa188f5986a76f5d3bc6ddbcf1647ce70fd9411698e1d8d694ea91f688a\\"", - "Type": "String", - }, - "AssetParametersc82a6fa188f5986a76f5d3bc6ddbcf1647ce70fd9411698e1d8d694ea91f688aS3VersionKey10E0E95D": Object { - "Description": "S3 key for asset version \\"c82a6fa188f5986a76f5d3bc6ddbcf1647ce70fd9411698e1d8d694ea91f688a\\"", - "Type": "String", - }, - "AssetParametersef2fb7a3c1a9327e753c7c4087c65e8ad44e35b19ac3cbb1879b7d74a4f0ae16ArtifactHash9A8A3080": Object { - "Description": "Artifact hash for asset \\"ef2fb7a3c1a9327e753c7c4087c65e8ad44e35b19ac3cbb1879b7d74a4f0ae16\\"", - "Type": "String", - }, - "AssetParametersef2fb7a3c1a9327e753c7c4087c65e8ad44e35b19ac3cbb1879b7d74a4f0ae16S3Bucket68E56E73": Object { - "Description": "S3 bucket for asset \\"ef2fb7a3c1a9327e753c7c4087c65e8ad44e35b19ac3cbb1879b7d74a4f0ae16\\"", - "Type": "String", - }, - "AssetParametersef2fb7a3c1a9327e753c7c4087c65e8ad44e35b19ac3cbb1879b7d74a4f0ae16S3VersionKey9E7EB7BC": Object { - "Description": "S3 key for asset version \\"ef2fb7a3c1a9327e753c7c4087c65e8ad44e35b19ac3cbb1879b7d74a4f0ae16\\"", - "Type": "String", - }, - }, - "Resources": Object { - "archiveordersLambdaFunction66659E04": Object { - "DependsOn": Array [ - "archiveordersLambdaFunctionServiceRoleDefaultPolicyDB67FB52", - "archiveordersLambdaFunctionServiceRoleE513ACF7", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Ref": "AssetParameters082c093d0decaeaf11ada975331e1e2e077c188737c9c1672ca3dac35a434cf2S3Bucket2D3D7D82", - }, - "S3Key": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::Select": Array [ - 0, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParameters082c093d0decaeaf11ada975331e1e2e077c188737c9c1672ca3dac35a434cf2S3VersionKey882A94CB", - }, - ], - }, - ], - }, - Object { - "Fn::Select": Array [ - 1, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParameters082c093d0decaeaf11ada975331e1e2e077c188737c9c1672ca3dac35a434cf2S3VersionKey882A94CB", - }, - ], - }, - ], - }, - ], - ], - }, - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefdatabaseEBDE4557157C00B6", - }, - }, - }, - "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ - "archiveordersLambdaFunctionServiceRoleE513ACF7", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "archiveordersLambdaFunctionServiceRoleDefaultPolicyDB67FB52": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - "/index/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "archiveordersLambdaFunctionServiceRoleDefaultPolicyDB67FB52", - "Roles": Array [ - Object { - "Ref": "archiveordersLambdaFunctionServiceRoleE513ACF7", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "archiveordersLambdaFunctionServiceRoleE513ACF7": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "calculatedtipstopicSnsTopicD6D93D2C": Object { - "Properties": Object { - "KmsMasterKeyId": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":kms:us-east-1:ACCOUNT_NUMBER_HERE:alias/aws/sns", - ], - ], - }, - }, - "Type": "AWS::SNS::Topic", - }, - "calculatedtipstopicSnsTopicPolicy092A0B4B": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "SNS:Publish", - "SNS:RemovePermission", - "SNS:SetTopicAttributes", - "SNS:DeleteTopic", - "SNS:ListSubscriptionsByTopic", - "SNS:GetTopicAttributes", - "SNS:Receive", - "SNS:AddPermission", - "SNS:Subscribe", - ], - "Condition": Object { - "StringEquals": Object { - "AWS:SourceOwner": "ACCOUNT_NUMBER_HERE", - }, - }, - "Effect": "Allow", - "Principal": Object { - "AWS": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::ACCOUNT_NUMBER_HERE:root", - ], - ], - }, - }, - "Resource": Object { - "Ref": "calculatedtipstopicSnsTopicD6D93D2C", - }, - "Sid": "TopicOwnerOnlyAccess", - }, - Object { - "Action": Array [ - "SNS:Publish", - "SNS:RemovePermission", - "SNS:SetTopicAttributes", - "SNS:DeleteTopic", - "SNS:ListSubscriptionsByTopic", - "SNS:GetTopicAttributes", - "SNS:Receive", - "SNS:AddPermission", - "SNS:Subscribe", - ], - "Condition": Object { - "Bool": Object { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": Object { - "AWS": "*", - }, - "Resource": Object { - "Ref": "calculatedtipstopicSnsTopicD6D93D2C", - }, - "Sid": "HttpsOnly", - }, - ], - "Version": "2012-10-17", - }, - "Topics": Array [ - Object { - "Ref": "calculatedtipstopicSnsTopicD6D93D2C", - }, - ], - }, - "Type": "AWS::SNS::TopicPolicy", - }, - "calculatetipsLambdaFunction9F2FE033": Object { - "DependsOn": Array [ - "calculatetipsLambdaFunctionServiceRoleDefaultPolicyED27C928", - "calculatetipsLambdaFunctionServiceRoleDE97A87F", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Ref": "AssetParametersef2fb7a3c1a9327e753c7c4087c65e8ad44e35b19ac3cbb1879b7d74a4f0ae16S3Bucket68E56E73", - }, - "S3Key": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::Select": Array [ - 0, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParametersef2fb7a3c1a9327e753c7c4087c65e8ad44e35b19ac3cbb1879b7d74a4f0ae16S3VersionKey9E7EB7BC", - }, - ], - }, - ], - }, - Object { - "Fn::Select": Array [ - 1, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParametersef2fb7a3c1a9327e753c7c4087c65e8ad44e35b19ac3cbb1879b7d74a4f0ae16S3VersionKey9E7EB7BC", - }, - ], - }, - ], - }, - ], - ], - }, - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefdatabaseEBDE4557157C00B6", - }, - "SNS_TOPIC_ARN": Object { - "Ref": "calculatedtipstopicSnsTopicD6D93D2C", - }, - "SNS_TOPIC_NAME": Object { - "Fn::GetAtt": Array [ - "calculatedtipstopicSnsTopicD6D93D2C", - "TopicName", - ], - }, - }, - }, - "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ - "calculatetipsLambdaFunctionServiceRoleDE97A87F", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "calculatetipsLambdaFunctionServiceRoleDE97A87F": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "calculatetipsLambdaFunctionServiceRoleDefaultPolicyED27C928": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - "/index/*", - ], - ], - }, - ], - }, - Object { - "Action": "sns:Publish", - "Effect": "Allow", - "Resource": Object { - "Ref": "calculatedtipstopicSnsTopicD6D93D2C", - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "calculatetipsLambdaFunctionServiceRoleDefaultPolicyED27C928", - "Roles": Array [ - Object { - "Ref": "calculatetipsLambdaFunctionServiceRoleDE97A87F", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "checkdelayedordersLambdaFunction2EC54227": Object { - "DependsOn": Array [ - "checkdelayedordersLambdaFunctionServiceRoleDefaultPolicyF409BC18", - "checkdelayedordersLambdaFunctionServiceRole513277E0", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Ref": "AssetParametersc82a6fa188f5986a76f5d3bc6ddbcf1647ce70fd9411698e1d8d694ea91f688aS3BucketD8C1F551", - }, - "S3Key": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::Select": Array [ - 0, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParametersc82a6fa188f5986a76f5d3bc6ddbcf1647ce70fd9411698e1d8d694ea91f688aS3VersionKey10E0E95D", - }, - ], - }, - ], - }, - Object { - "Fn::Select": Array [ - 1, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParametersc82a6fa188f5986a76f5d3bc6ddbcf1647ce70fd9411698e1d8d694ea91f688aS3VersionKey10E0E95D", - }, - ], - }, - ], - }, - ], - ], - }, - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefdatabaseEBDE4557157C00B6", - }, - "OPEN_ORDER_THRESHOLD_MINS": "30", - "SNS_TOPIC_ARN": Object { - "Ref": "checkdelayedordersnotifierSnsTopic66813909", - }, - "SNS_TOPIC_NAME": Object { - "Fn::GetAtt": Array [ - "checkdelayedordersnotifierSnsTopic66813909", - "TopicName", - ], - }, - }, - }, - "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ - "checkdelayedordersLambdaFunctionServiceRole513277E0", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "checkdelayedordersLambdaFunctionAwsEventsLambdaInvokePermission165AA4438": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "checkdelayedordersLambdaFunction2EC54227", - "Arn", - ], - }, - "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ - "checkdelayedordersschedulerEventsRule980E5207", - "Arn", - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "checkdelayedordersLambdaFunctionServiceRole513277E0": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "checkdelayedordersLambdaFunctionServiceRoleDefaultPolicyF409BC18": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - "/index/*", - ], - ], - }, - ], - }, - Object { - "Action": "sns:Publish", - "Effect": "Allow", - "Resource": Object { - "Ref": "checkdelayedordersnotifierSnsTopic66813909", - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "checkdelayedordersLambdaFunctionServiceRoleDefaultPolicyF409BC18", - "Roles": Array [ - Object { - "Ref": "checkdelayedordersLambdaFunctionServiceRole513277E0", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "checkdelayedordersnotifierSnsTopic66813909": Object { - "Properties": Object { - "KmsMasterKeyId": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":kms:us-east-1:ACCOUNT_NUMBER_HERE:alias/aws/sns", - ], - ], - }, - }, - "Type": "AWS::SNS::Topic", - }, - "checkdelayedordersnotifierSnsTopicPolicy673080E4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "SNS:Publish", - "SNS:RemovePermission", - "SNS:SetTopicAttributes", - "SNS:DeleteTopic", - "SNS:ListSubscriptionsByTopic", - "SNS:GetTopicAttributes", - "SNS:Receive", - "SNS:AddPermission", - "SNS:Subscribe", - ], - "Condition": Object { - "StringEquals": Object { - "AWS:SourceOwner": "ACCOUNT_NUMBER_HERE", - }, - }, - "Effect": "Allow", - "Principal": Object { - "AWS": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::ACCOUNT_NUMBER_HERE:root", - ], - ], - }, - }, - "Resource": Object { - "Ref": "checkdelayedordersnotifierSnsTopic66813909", - }, - "Sid": "TopicOwnerOnlyAccess", - }, - Object { - "Action": Array [ - "SNS:Publish", - "SNS:RemovePermission", - "SNS:SetTopicAttributes", - "SNS:DeleteTopic", - "SNS:ListSubscriptionsByTopic", - "SNS:GetTopicAttributes", - "SNS:Receive", - "SNS:AddPermission", - "SNS:Subscribe", - ], - "Condition": Object { - "Bool": Object { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": Object { - "AWS": "*", - }, - "Resource": Object { - "Ref": "checkdelayedordersnotifierSnsTopic66813909", - }, - "Sid": "HttpsOnly", - }, - ], - "Version": "2012-10-17", - }, - "Topics": Array [ - Object { - "Ref": "checkdelayedordersnotifierSnsTopic66813909", - }, - ], - }, - "Type": "AWS::SNS::TopicPolicy", - }, - "checkdelayedordersschedulerEventsRule980E5207": Object { - "Properties": Object { - "ScheduleExpression": "rate(5 minutes)", - "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ - "checkdelayedordersLambdaFunction2EC54227", - "Arn", - ], - }, - "Id": "Target0", - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "closeoutserviceExecutionAbortedAlarm861B143E": Object { - "Properties": Object { - "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "Dimensions": Array [ - Object { - "Name": "StateMachineArn", - "Value": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - ], - "EvaluationPeriods": 1, - "MetricName": "ExecutionsAborted", - "Namespace": "AWS/States", - "Period": 300, - "Statistic": "Maximum", - "Threshold": 1, - }, - "Type": "AWS::CloudWatch::Alarm", - }, - "closeoutserviceExecutionFailedAlarm7495D8BE": Object { - "Properties": Object { - "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "Dimensions": Array [ - Object { - "Name": "StateMachineArn", - "Value": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - ], - "EvaluationPeriods": 1, - "MetricName": "ExecutionsFailed", - "Namespace": "AWS/States", - "Period": 300, - "Statistic": "Sum", - "Threshold": 1, - }, - "Type": "AWS::CloudWatch::Alarm", - }, - "closeoutserviceExecutionThrottledAlarmC5A6E612": Object { - "Properties": Object { - "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "Dimensions": Array [ - Object { - "Name": "StateMachineArn", - "Value": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - ], - "EvaluationPeriods": 1, - "MetricName": "ExecutionThrottled", - "Namespace": "AWS/States", - "Period": 300, - "Statistic": "Sum", - "Threshold": 1, - }, - "Type": "AWS::CloudWatch::Alarm", - }, - "closeoutserviceLambdaFunction684B26D3": Object { - "DependsOn": Array [ - "closeoutserviceLambdaFunctionServiceRoleDefaultPolicy95A79CC3", - "closeoutserviceLambdaFunctionServiceRoleB49E9696", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Ref": "AssetParameters5dc0666f057bc99738d8505d74a8f25576fc501d98f95ea7e69b36b3a7dd6ad1S3BucketF5B31E9E", - }, - "S3Key": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::Select": Array [ - 0, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParameters5dc0666f057bc99738d8505d74a8f25576fc501d98f95ea7e69b36b3a7dd6ad1S3VersionKey4A579976", - }, - ], - }, - ], - }, - Object { - "Fn::Select": Array [ - 1, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParameters5dc0666f057bc99738d8505d74a8f25576fc501d98f95ea7e69b36b3a7dd6ad1S3VersionKey4A579976", - }, - ], - }, - ], - }, - ], - ], - }, - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "STATE_MACHINE_ARN": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - }, - "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ - "closeoutserviceLambdaFunctionServiceRoleB49E9696", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "closeoutserviceLambdaFunctionServiceRoleB49E9696": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "closeoutserviceLambdaFunctionServiceRoleDefaultPolicy95A79CC3": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": "states:StartExecution", - "Effect": "Allow", - "Resource": Object { - "Ref": "closeoutserviceStateMachineC9DD68A8", - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "closeoutserviceLambdaFunctionServiceRoleDefaultPolicy95A79CC3", - "Roles": Array [ - Object { - "Ref": "closeoutserviceLambdaFunctionServiceRoleB49E9696", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "closeoutserviceStateMachineC9DD68A8": Object { - "DependsOn": Array [ - "closeoutserviceStateMachineRoleDefaultPolicy5F05BEB8", - "closeoutserviceStateMachineRoleCA7F9A09", - ], - "Properties": Object { - "DefinitionString": Object { - "Fn::Join": Array [ - "", - Array [ - "{\\"StartAt\\":\\"create-reports-task\\",\\"States\\":{\\"create-reports-task\\":{\\"Next\\":\\"calculate-tips-task\\",\\"Type\\":\\"Task\\",\\"Resource\\":\\"", - Object { - "Fn::GetAtt": Array [ - "createreportLambdaFunctionB37EBE52", - "Arn", - ], - }, - "\\"},\\"calculate-tips-task\\":{\\"Next\\":\\"archive-orders-task\\",\\"Type\\":\\"Task\\",\\"Resource\\":\\"", - Object { - "Fn::GetAtt": Array [ - "calculatetipsLambdaFunction9F2FE033", - "Arn", - ], - }, - "\\"},\\"archive-orders-task\\":{\\"End\\":true,\\"Type\\":\\"Task\\",\\"Resource\\":\\"", - Object { - "Fn::GetAtt": Array [ - "archiveordersLambdaFunction66659E04", - "Arn", - ], - }, - "\\"}}}", - ], - ], - }, - "LoggingConfiguration": Object { - "Destinations": Array [ - Object { - "CloudWatchLogsLogGroup": Object { - "LogGroupArn": Object { - "Fn::GetAtt": Array [ - "closeoutserviceStateMachineLogGroup56CA2C8F", - "Arn", - ], - }, - }, - }, - ], - "Level": "ERROR", - }, - "RoleArn": Object { - "Fn::GetAtt": Array [ - "closeoutserviceStateMachineRoleCA7F9A09", - "Arn", - ], - }, - }, - "Type": "AWS::StepFunctions::StateMachine", - }, - "closeoutserviceStateMachineLogGroup56CA2C8F": Object { - "DeletionPolicy": "Retain", - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely", - }, - Object { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)", - }, - ], - }, - }, - "Properties": Object { - "LogGroupName": "/aws/vendedlogs/states/managerstackcloseoutservicestatemachinelog5da3d5b2d585", - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - }, - "closeoutserviceStateMachineRoleCA7F9A09": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "states.us-east-1.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "closeoutserviceStateMachineRoleDefaultPolicy5F05BEB8": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "The 'LogDelivery' actions do not support resource-level authorizations", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogDelivery", - "logs:GetLogDelivery", - "logs:UpdateLogDelivery", - "logs:DeleteLogDelivery", - "logs:ListLogDeliveries", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": "lambda:InvokeFunction", - "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ - "createreportLambdaFunctionB37EBE52", - "Arn", - ], - }, - }, - Object { - "Action": "lambda:InvokeFunction", - "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ - "calculatetipsLambdaFunction9F2FE033", - "Arn", - ], - }, - }, - Object { - "Action": "lambda:InvokeFunction", - "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ - "archiveordersLambdaFunction66659E04", - "Arn", - ], - }, - }, - Object { - "Action": Array [ - "logs:PutResourcePolicy", - "logs:DescribeResourcePolicies", - "logs:DescribeLogGroups", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "closeoutserviceStateMachineRoleDefaultPolicy5F05BEB8", - "Roles": Array [ - Object { - "Ref": "closeoutserviceStateMachineRoleCA7F9A09", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "createreportLambdaFunctionB37EBE52": Object { - "DependsOn": Array [ - "createreportLambdaFunctionServiceRoleDefaultPolicy5A317B6C", - "createreportLambdaFunctionServiceRole33C78256", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Ref": "AssetParameters2f0da58e411ab6b0549e6ad40bf1c54171752a646b89e453c5c3803ff20c254cS3Bucket1B8C7DD7", - }, - "S3Key": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::Select": Array [ - 0, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParameters2f0da58e411ab6b0549e6ad40bf1c54171752a646b89e453c5c3803ff20c254cS3VersionKey6C2FB92E", - }, - ], - }, - ], - }, - Object { - "Fn::Select": Array [ - 1, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParameters2f0da58e411ab6b0549e6ad40bf1c54171752a646b89e453c5c3803ff20c254cS3VersionKey6C2FB92E", - }, - ], - }, - ], - }, - ], - ], - }, - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefdatabaseEBDE4557157C00B6", - }, - "S3_BUCKET_NAME": Object { - "Ref": "reportsbucketS3BucketCC334898", - }, - }, - }, - "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ - "createreportLambdaFunctionServiceRole33C78256", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "createreportLambdaFunctionServiceRole33C78256": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "createreportLambdaFunctionServiceRoleDefaultPolicy5A317B6C": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - "/index/*", - ], - ], - }, - ], - }, - Object { - "Action": Array [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject*", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "createreportLambdaFunctionServiceRoleDefaultPolicy5A317B6C", - "Roles": Array [ - Object { - "Ref": "createreportLambdaFunctionServiceRole33C78256", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "listordersLambdaFunction78C3BA19": Object { - "DependsOn": Array [ - "listordersLambdaFunctionServiceRoleDefaultPolicyA214985E", - "listordersLambdaFunctionServiceRole3371D255", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W58", - "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions.", - }, - Object { - "id": "W89", - "reason": "This is not a rule for the general case, just for specific use cases/industries", - }, - Object { - "id": "W92", - "reason": "Impossible for us to define the correct concurrency for clients", - }, - ], - }, - }, - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Ref": "AssetParameters3579f3ba4ed0a2e2a89e25a539f1b17dc8fe7d795e0e4cd6e93d875c48f3ecfbS3Bucket9ED6F329", - }, - "S3Key": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::Select": Array [ - 0, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParameters3579f3ba4ed0a2e2a89e25a539f1b17dc8fe7d795e0e4cd6e93d875c48f3ecfbS3VersionKey32CA5343", - }, - ], - }, - ], - }, - Object { - "Fn::Select": Array [ - 1, - Object { - "Fn::Split": Array [ - "||", - Object { - "Ref": "AssetParameters3579f3ba4ed0a2e2a89e25a539f1b17dc8fe7d795e0e4cd6e93d875c48f3ecfbS3VersionKey32CA5343", - }, - ], - }, - ], - }, - ], - ], - }, - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DDB_TABLE_NAME": Object { - "Fn::ImportValue": "SharedStack:ExportsOutputRefdatabaseEBDE4557157C00B6", - }, - }, - }, - "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ - "listordersLambdaFunctionServiceRole3371D255", - "Arn", - ], - }, - "Runtime": "nodejs14.x", - "TracingConfig": Object { - "Mode": "Active", - }, - }, - "Type": "AWS::Lambda::Function", - }, - "listordersLambdaFunctionServiceRole3371D255": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":log-group:/aws/lambda/*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaFunctionServiceRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "listordersLambdaFunctionServiceRoleDefaultPolicyA214985E": Object { - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W12", - "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC.", - }, - ], - }, - }, - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "xray:PutTraceSegments", - "xray:PutTelemetryRecords", - ], - "Effect": "Allow", - "Resource": "*", - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::ImportValue": "SharedStack:ExportsOutputFnGetAttdatabaseEBDE4557ArnC01D766F", - }, - "/index/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "listordersLambdaFunctionServiceRoleDefaultPolicyA214985E", - "Roles": Array [ - Object { - "Ref": "listordersLambdaFunctionServiceRole3371D255", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "managerapiApiAccessLogGroup35F9537B": Object { - "DeletionPolicy": "Retain", - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely", - }, - Object { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)", - }, - ], - }, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - }, - "managerapiCognitoAuthorizer5745AF8D": Object { - "Properties": Object { - "IdentitySource": "method.request.header.Authorization", - "Name": "authorizer", - "ProviderARNs": Array [ - Object { - "Fn::GetAtt": Array [ - "managerapiCognitoUserPool03946196", - "Arn", - ], - }, - ], - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "Type": "COGNITO_USER_POOLS", - }, - "Type": "AWS::ApiGateway::Authorizer", - }, - "managerapiCognitoUserPool03946196": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AccountRecoverySetting": Object { - "RecoveryMechanisms": Array [ - Object { - "Name": "verified_phone_number", - "Priority": 1, - }, - Object { - "Name": "verified_email", - "Priority": 2, - }, - ], - }, - "AdminCreateUserConfig": Object { - "AllowAdminCreateUserOnly": true, - }, - "EmailVerificationMessage": "The verification code to your new account is {####}", - "EmailVerificationSubject": "Verify your new account", - "SmsVerificationMessage": "The verification code to your new account is {####}", - "UserPoolAddOns": Object { - "AdvancedSecurityMode": "ENFORCED", - }, - "VerificationMessageTemplate": Object { - "DefaultEmailOption": "CONFIRM_WITH_CODE", - "EmailMessage": "The verification code to your new account is {####}", - "EmailSubject": "Verify your new account", - "SmsMessage": "The verification code to your new account is {####}", - }, - }, - "Type": "AWS::Cognito::UserPool", - "UpdateReplacePolicy": "Retain", - }, - "managerapiCognitoUserPoolClientB3BC933D": Object { - "Properties": Object { - "AllowedOAuthFlows": Array [ - "implicit", - "code", - ], - "AllowedOAuthFlowsUserPoolClient": true, - "AllowedOAuthScopes": Array [ - "profile", - "phone", - "email", - "openid", - "aws.cognito.signin.user.admin", - ], - "CallbackURLs": Array [ - "https://example.com", - ], - "SupportedIdentityProviders": Array [ - "COGNITO", - ], - "UserPoolId": Object { - "Ref": "managerapiCognitoUserPool03946196", - }, - }, - "Type": "AWS::Cognito::UserPoolClient", - }, - "managerapiLambdaRestApi62BEEAC7": Object { - "Properties": Object { - "EndpointConfiguration": Object { - "Types": Array [ - "EDGE", - ], - }, - "Name": "LambdaRestApi", - }, - "Type": "AWS::ApiGateway::RestApi", - }, - "managerapiLambdaRestApiAccount350A78F5": Object { - "DependsOn": Array [ - "managerapiLambdaRestApi62BEEAC7", - ], - "Properties": Object { - "CloudWatchRoleArn": Object { - "Fn::GetAtt": Array [ - "managerapiLambdaRestApiCloudWatchRole43F48235", - "Arn", - ], - }, - }, - "Type": "AWS::ApiGateway::Account", - }, - "managerapiLambdaRestApiCloudWatchRole43F48235": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "apigateway.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": Array [ - Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:DescribeLogGroups", - "logs:DescribeLogStreams", - "logs:PutLogEvents", - "logs:GetLogEvents", - "logs:FilterLogEvents", - ], - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":logs:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":*", - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LambdaRestApiCloudWatchRolePolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "managerapiLambdaRestApiDeployment719D102Af9d615a7825f1f2f2844015860433cab": Object { - "DependsOn": Array [ - "managerapiLambdaRestApicloseoutserviceproxyANY182BEB46", - "managerapiLambdaRestApicloseoutserviceproxyECAF0FA1", - "managerapiLambdaRestApicloseoutservice2D3987E6", - "managerapiLambdaRestApilistordersproxyANY9C43AA89", - "managerapiLambdaRestApilistordersproxy3993085F", - "managerapiLambdaRestApilistorders017D1C2F", - "managerapiLambdaRestApireportsGET3B0B072F", - "managerapiLambdaRestApireportsA438BAFD", - ], - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource", - }, - ], - }, - }, - "Properties": Object { - "Description": "Automatically created by the RestApi construct", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Deployment", - }, - "managerapiLambdaRestApiDeploymentStageprod59C4A8D4": Object { - "Properties": Object { - "AccessLogSetting": Object { - "DestinationArn": Object { - "Fn::GetAtt": Array [ - "managerapiApiAccessLogGroup35F9537B", - "Arn", - ], - }, - "Format": "{\\"requestId\\":\\"$context.requestId\\",\\"ip\\":\\"$context.identity.sourceIp\\",\\"user\\":\\"$context.identity.user\\",\\"caller\\":\\"$context.identity.caller\\",\\"requestTime\\":\\"$context.requestTime\\",\\"httpMethod\\":\\"$context.httpMethod\\",\\"resourcePath\\":\\"$context.resourcePath\\",\\"status\\":\\"$context.status\\",\\"protocol\\":\\"$context.protocol\\",\\"responseLength\\":\\"$context.responseLength\\"}", - }, - "DeploymentId": Object { - "Ref": "managerapiLambdaRestApiDeployment719D102Af9d615a7825f1f2f2844015860433cab", - }, - "MethodSettings": Array [ - Object { - "DataTraceEnabled": true, - "HttpMethod": "*", - "LoggingLevel": "INFO", - "ResourcePath": "/*", - }, - ], - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "StageName": "prod", - "TracingEnabled": true, - }, - "Type": "AWS::ApiGateway::Stage", - }, - "managerapiLambdaRestApiUsagePlanF10CE619": Object { - "Properties": Object { - "ApiStages": Array [ - Object { - "ApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "Stage": Object { - "Ref": "managerapiLambdaRestApiDeploymentStageprod59C4A8D4", - }, - "Throttle": Object {}, - }, - ], - }, - "Type": "AWS::ApiGateway::UsagePlan", - }, - "managerapiLambdaRestApicloseoutservice2D3987E6": Object { - "Properties": Object { - "ParentId": Object { - "Fn::GetAtt": Array [ - "managerapiLambdaRestApi62BEEAC7", - "RootResourceId", - ], - }, - "PathPart": "close-out-service", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApicloseoutserviceproxyANY182BEB46": Object { - "Properties": Object { - "AuthorizationType": "COGNITO_USER_POOLS", - "AuthorizerId": Object { - "Ref": "managerapiCognitoAuthorizer5745AF8D", - }, - "HttpMethod": "ANY", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:us-east-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "closeoutserviceLambdaFunction684B26D3", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "ResourceId": Object { - "Ref": "managerapiLambdaRestApicloseoutserviceproxyECAF0FA1", - }, - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "managerapiLambdaRestApicloseoutserviceproxyANYApiPermissionManagerStackmanagerapiLambdaRestApi386CA826ANYcloseoutserviceproxy132F7E1D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "closeoutserviceLambdaFunction684B26D3", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:us-east-1:ACCOUNT_NUMBER_HERE:", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/", - Object { - "Ref": "managerapiLambdaRestApiDeploymentStageprod59C4A8D4", - }, - "/*/close-out-service/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "managerapiLambdaRestApicloseoutserviceproxyANYApiPermissionTestManagerStackmanagerapiLambdaRestApi386CA826ANYcloseoutserviceproxy8A25C882": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "closeoutserviceLambdaFunction684B26D3", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:us-east-1:ACCOUNT_NUMBER_HERE:", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/test-invoke-stage/*/close-out-service/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "managerapiLambdaRestApicloseoutserviceproxyECAF0FA1": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "managerapiLambdaRestApicloseoutservice2D3987E6", - }, - "PathPart": "{proxy+}", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApilistorders017D1C2F": Object { - "Properties": Object { - "ParentId": Object { - "Fn::GetAtt": Array [ - "managerapiLambdaRestApi62BEEAC7", - "RootResourceId", - ], - }, - "PathPart": "list-orders", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApilistordersproxy3993085F": Object { - "Properties": Object { - "ParentId": Object { - "Ref": "managerapiLambdaRestApilistorders017D1C2F", - }, - "PathPart": "{proxy+}", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApilistordersproxyANY9C43AA89": Object { - "Properties": Object { - "AuthorizationType": "COGNITO_USER_POOLS", - "AuthorizerId": Object { - "Ref": "managerapiCognitoAuthorizer5745AF8D", - }, - "HttpMethod": "ANY", - "Integration": Object { - "IntegrationHttpMethod": "POST", - "Type": "AWS_PROXY", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:us-east-1:lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "listordersLambdaFunction78C3BA19", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "ResourceId": Object { - "Ref": "managerapiLambdaRestApilistordersproxy3993085F", - }, - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "managerapiLambdaRestApilistordersproxyANYApiPermissionManagerStackmanagerapiLambdaRestApi386CA826ANYlistordersproxyF55EE737": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "listordersLambdaFunction78C3BA19", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:us-east-1:ACCOUNT_NUMBER_HERE:", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/", - Object { - "Ref": "managerapiLambdaRestApiDeploymentStageprod59C4A8D4", - }, - "/*/list-orders/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "managerapiLambdaRestApilistordersproxyANYApiPermissionTestManagerStackmanagerapiLambdaRestApi386CA826ANYlistordersproxyA58F4DD8": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "listordersLambdaFunction78C3BA19", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:us-east-1:ACCOUNT_NUMBER_HERE:", - Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - "/test-invoke-stage/*/list-orders/*", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "managerapiLambdaRestApireportsA438BAFD": Object { - "Properties": Object { - "ParentId": Object { - "Fn::GetAtt": Array [ - "managerapiLambdaRestApi62BEEAC7", - "RootResourceId", - ], - }, - "PathPart": "reports", - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Resource", - }, - "managerapiLambdaRestApireportsGET3B0B072F": Object { - "Properties": Object { - "AuthorizationType": "COGNITO_USER_POOLS", - "AuthorizerId": Object { - "Ref": "managerapiCognitoAuthorizer5745AF8D", - }, - "HttpMethod": "GET", - "Integration": Object { - "Credentials": Object { - "Fn::GetAtt": Array [ - "roleC7B7E775", - "Arn", - ], - }, - "IntegrationHttpMethod": "GET", - "Type": "AWS", - "Uri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:us-east-1:s3:path/{bucket}", - ], - ], - }, - }, - "MethodResponses": Array [ - Object { - "StatusCode": "200", - }, - ], - "ResourceId": Object { - "Ref": "managerapiLambdaRestApireportsA438BAFD", - }, - "RestApiId": Object { - "Ref": "managerapiLambdaRestApi62BEEAC7", - }, - }, - "Type": "AWS::ApiGateway::Method", - }, - "reportsbucketS3BucketCC334898": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "BucketEncryption": Object { - "ServerSideEncryptionConfiguration": Array [ - Object { - "ServerSideEncryptionByDefault": Object { - "SSEAlgorithm": "AES256", - }, - }, - ], - }, - "LifecycleConfiguration": Object { - "Rules": Array [ - Object { - "NoncurrentVersionTransitions": Array [ - Object { - "StorageClass": "GLACIER", - "TransitionInDays": 90, - }, - ], - "Status": "Enabled", - }, - ], - }, - "LoggingConfiguration": Object { - "DestinationBucketName": Object { - "Ref": "reportsbucketS3LoggingBucket088F7E0E", - }, - }, - "PublicAccessBlockConfiguration": Object { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true, - }, - "VersioningConfiguration": Object { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Retain", - }, - "reportsbucketS3BucketPolicyCF9C1527": Object { - "Properties": Object { - "Bucket": Object { - "Ref": "reportsbucketS3BucketCC334898", - }, - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "*", - "Condition": Object { - "Bool": Object { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": Object { - "AWS": "*", - }, - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - "/*", - ], - ], - }, - "Sid": "HttpsOnly", - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "reportsbucketS3LoggingBucket088F7E0E": Object { - "DeletionPolicy": "Retain", - "Metadata": Object { - "cfn_nag": Object { - "rules_to_suppress": Array [ - Object { - "id": "W35", - "reason": "This S3 bucket is used as the access logging bucket for another bucket", - }, - ], - }, - }, - "Properties": Object { - "AccessControl": "LogDeliveryWrite", - "BucketEncryption": Object { - "ServerSideEncryptionConfiguration": Array [ - Object { - "ServerSideEncryptionByDefault": Object { - "SSEAlgorithm": "AES256", - }, - }, - ], - }, - "PublicAccessBlockConfiguration": Object { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true, - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Retain", - }, - "reportsbucketS3LoggingBucketPolicy82A7D267": Object { - "Properties": Object { - "Bucket": Object { - "Ref": "reportsbucketS3LoggingBucket088F7E0E", - }, - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "*", - "Condition": Object { - "Bool": Object { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": Object { - "AWS": "*", - }, - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3LoggingBucket088F7E0E", - "Arn", - ], - }, - "/*", - ], - ], - }, - "Sid": "HttpsOnly", - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "roleC7B7E775": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "apigateway.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Path": "/service-role/", - }, - "Type": "AWS::IAM::Role", - }, - "roleDefaultPolicy7C980EBA": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - Object { - "Fn::Join": Array [ - "", - Array [ - Object { - "Fn::GetAtt": Array [ - "reportsbucketS3BucketCC334898", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "roleDefaultPolicy7C980EBA", - "Roles": Array [ - Object { - "Ref": "roleC7B7E775", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - }, -} -`; diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.js.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.js.snap index 838090773..c37d27adf 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.js.snap +++ b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.js.snap @@ -66,11 +66,10 @@ Object { "S3Bucket": Object { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "5fec086605565b291ca1224e3f1e0fd0426daef8d94a60e13094691c360b2d61.zip", + "S3Key": "f7e78725db82a6bcdfb3881f27ecf9760863196f64e16042f3eb567f522d9449.zip", }, "Environment": Object { "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "DDB_TABLE_NAME": Object { "Fn::ImportValue": "SharedStack:ExportsOutputRefordertable80C5609084F626AD", }, @@ -83,7 +82,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Timeout": 15, "TracingConfig": Object { "Mode": "Active", @@ -241,11 +240,10 @@ Object { "S3Bucket": Object { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "8d832041090c6117ec13ab972ef4301b41a5e5a8c030546b56f79be55b45a691.zip", + "S3Key": "f3fb724d107c92bcdc47f3123f612fd2cd0eecd312331259982cb439df89f4eb.zip", }, "Environment": Object { "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "DDB_TABLE_NAME": Object { "Fn::ImportValue": "SharedStack:ExportsOutputRefordertable80C5609084F626AD", }, @@ -258,7 +256,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Timeout": 15, "TracingConfig": Object { "Mode": "Active", @@ -591,7 +589,7 @@ Object { }, }, "Properties": Object { - "Description": "Automatically created by the RestApi construct", + "Description": "Demo: Service staff API", "RestApiId": Object { "Ref": "servicestaffapiLambdaRestApi81C353A0", }, diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.ts.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.ts.snap index 884cab4f0..f91c4e580 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.ts.snap +++ b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.ts.snap @@ -130,7 +130,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": Object { "Mode": "Active", }, @@ -335,7 +335,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "TracingConfig": Object { "Mode": "Active", }, diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/sharedStack.test.js.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/sharedStack.test.js.snap index 90236dca8..20d7f4777 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/sharedStack.test.js.snap +++ b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/sharedStack.test.js.snap @@ -118,13 +118,13 @@ Object { "shareddbfunctionslayerA9CFEC5A": Object { "Properties": Object { "CompatibleRuntimes": Array [ - "nodejs14.x", + "nodejs16.x", ], "Content": Object { "S3Bucket": Object { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-us-east-1", }, - "S3Key": "1e2da15c61e02d6b4d9a0d275ac198d3772dc45465f064a330f35db63a01bb00.zip", + "S3Key": "10564c98f41d5ddbd78ce6aa50e29a44184e170be4b504e0bdcdb341bf04f129.zip", }, "Description": "Layer for common database access functions", "LicenseInfo": "Apache-2.0", diff --git a/source/use_cases/aws-restaurant-management-demo/test/integ.basic-deployment.expected.json b/source/use_cases/aws-restaurant-management-demo/test/integ.basic-deployment.expected.json index af4358c12..2d19e9dd9 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/integ.basic-deployment.expected.json +++ b/source/use_cases/aws-restaurant-management-demo/test/integ.basic-deployment.expected.json @@ -245,7 +245,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x" + "Runtime": "nodejs16.x" }, "DependsOn": [ "CloudFrontToS3SetHttpSecurityHeadersServiceRole6BABDE10" @@ -655,7 +655,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Environment": { "Variables": { "USER_ON_EVENT_FUNCTION_ARN": { diff --git a/source/use_cases/aws-restaurant-management-demo/test/managerStack.test.ts b/source/use_cases/aws-restaurant-management-demo/test/managerStack.test.ts deleted file mode 100644 index bb726994b..000000000 --- a/source/use_cases/aws-restaurant-management-demo/test/managerStack.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - - import { App } from 'aws-cdk-lib'; - import { ExistingResources } from '../lib/existing-resources'; - import { SharedStack } from '../lib/shared-stack'; - import { ManagerStack } from '../lib/manager-stack'; - import { Template } from 'aws-cdk-lib/assertions'; - - test('test-manager-stack', () => { - const app = new App(); - // Dependent stacks - const existingResources = new ExistingResources(app, `ExistingResourcesStack`); - const sharedStack = new SharedStack(app, `SharedStack`); - // ---- - const stack = new ManagerStack(app, 'ManagerStack', { - db: sharedStack.database, - archiveBucket: existingResources.archiveBucket, - layer: sharedStack.layer - }); - - const template = Template.fromStack(stack); - expect(template).toMatchSnapshot(); - }); \ No newline at end of file diff --git a/source/use_cases/aws-s3-static-website/test/__snapshots__/s3-static-site-stack.test.js.snap b/source/use_cases/aws-s3-static-website/test/__snapshots__/s3-static-site-stack.test.js.snap index 03b065999..39d8b4777 100644 --- a/source/use_cases/aws-s3-static-website/test/__snapshots__/s3-static-site-stack.test.js.snap +++ b/source/use_cases/aws-s3-static-website/test/__snapshots__/s3-static-site-stack.test.js.snap @@ -438,7 +438,7 @@ Object { "S3Bucket": Object { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "a25ad9c0d11729e2a901249c21b3095a071174c6fc98296269154dcebbb42a08.zip", + "S3Key": "e8fea7e029780f03a78580d41b7ffbc4551d6e7d6caa190a451880191c166189.zip", }, "Description": "AWS CDK resource provider framework - onEvent (S3StaticWebsiteStack/CustomResourceProvider)", "Environment": Object { @@ -458,7 +458,7 @@ Object { "Arn", ], }, - "Runtime": "nodejs12.x", + "Runtime": "nodejs14.x", "Timeout": 900, }, "Type": "AWS::Lambda::Function", diff --git a/source/use_cases/aws-s3-static-website/test/integ.basic-deployment.expected.json b/source/use_cases/aws-s3-static-website/test/integ.basic-deployment.expected.json index 3128a568e..f7289e228 100644 --- a/source/use_cases/aws-s3-static-website/test/integ.basic-deployment.expected.json +++ b/source/use_cases/aws-s3-static-website/test/integ.basic-deployment.expected.json @@ -617,7 +617,7 @@ } }, "Handler": "framework.onEvent", - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Timeout": 900 }, "DependsOn": [ From 24f14ae53ac2b6781701102682b52e64e9cb05b0 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Tue, 11 Apr 2023 17:08:21 +0000 Subject: [PATCH 03/73] chore(release): 2.37.0 --- CHANGELOG.md | 8 ++++++++ source/lerna.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 220e5c75c..408da4500 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.37.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.36.0...v2.37.0) (2023-04-11) + + +### Bug Fixes + +* **all constructs:** use aws.partition where value could refer to govcloud ([#941](https://github.com/awslabs/aws-solutions-constructs/issues/941)) ([e4cc3c0](https://github.com/awslabs/aws-solutions-constructs/commit/e4cc3c090d669a8f163adb013c26fcd3796b5d8b)) +* **s3-bucket-helper:** not populating response.loggingBucket when bucket supplied ([#934](https://github.com/awslabs/aws-solutions-constructs/issues/934)) ([b65986d](https://github.com/awslabs/aws-solutions-constructs/commit/b65986d7d1791c2ed19e62c8f39ffe42b6f2a274)) + ## [2.36.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.35.0...v2.36.0) (2023-03-29) Built on CDK v2.71.0 diff --git a/source/lerna.json b/source/lerna.json index 7b4f508d5..e3a06aed7 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.36.0" + "version": "2.37.0" } From 8d15e347dad4c9acfd051651c1fb74cf86d9d662 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Tue, 11 Apr 2023 13:14:00 -0400 Subject: [PATCH 04/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 408da4500..1ea918318 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. See [standa ## [2.37.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.36.0...v2.37.0) (2023-04-11) +Built on CDK v2.73.0 + +### Features + +* **wafwebacl-all:** allow any type for webAclProps ([#943](https://github.com/awslabs/aws-solutions-constructs/pull/943)) ### Bug Fixes From b277631a5e61c7b590f95f1469eee79d3749dbb2 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Tue, 11 Apr 2023 13:14:02 -0400 Subject: [PATCH 05/73] chore(version): Upgraded CDK --- deployment/v2/align-version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v2/align-version.js b/deployment/v2/align-version.js index 366e78e53..3cf60a7a6 100755 --- a/deployment/v2/align-version.js +++ b/deployment/v2/align-version.js @@ -10,7 +10,7 @@ const findVersion = process.argv[2]; const replaceVersion = process.argv[3]; // these versions need to be sourced from a config file -const awsCdkLibVersion = '2.71.0'; +const awsCdkLibVersion = '2.73.0'; const constructsVersion = '10.0.0'; const MODULE_EXEMPTIONS = new Set([ '@aws-cdk/cloudformation-diff', From 46d02ccf98e368206b59c27a16003dc3b16d4236 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Sun, 16 Apr 2023 07:57:15 -0400 Subject: [PATCH 06/73] fix(s3-constructs): accommodate s3 change that disables acls by default (#949) * Remove access Control override (avoid ACLs) * Remove all S3 ACLs and adjust tests accordingly * Two more constructs --- ...ustomCloudfrontLoggingBucket.expected.json | 15 ++- .../test/integ.no-arguments.expected.json | 15 ++- .../integ.override-behavior.expected.json | 15 ++- .../test.cloudfront-apigateway-lambda.test.ts | 2 +- ...ustomCloudfrontLoggingBucket.expected.json | 15 ++- .../test/integ.no-arguments.expected.json | 15 ++- .../test/test.cloudfront-apigateway.test.ts | 2 +- .../test/cloudfront-mediastore.test.ts | 2 +- ...ustomCloudFrontLoggingBucket.expected.json | 15 ++- .../test/integ.default.expected.json | 15 ++- .../integ.existingContainer.expected.json | 15 ++- .../integ.overrideProperties.expected.json | 15 ++- ...g.withSecurityHeaderBehavior.expected.json | 7 + ...g.withoutHttpSecurityHeaders.expected.json | 9 +- .../aws-cloudfront-s3/lib/index.ts | 5 + .../integ.custom-originPath.expected.json | 52 +++++++- ...nteg.custom-security-headers.expected.json | 78 ++++++++--- ...ustomCloudFrontLoggingBucket.expected.json | 52 +++++++- .../integ.customLoggingBucket.expected.json | 52 +++++++- .../test/integ.existing-bucket.expected.json | 15 ++- .../test/integ.no-arguments.expected.json | 15 ++- .../integ.no-security-headers.expected.json | 46 ++++++- .../test/test.cloudfront-s3.test.ts | 13 +- .../lib/index.ts | 5 + .../eventbridge-kinesisfirehose-s3.test.ts | 4 +- .../integ.customLoggingBucket.expected.json | 37 +++++- ...esisfirehose-s3-no-arguments.expected.json | 37 +++++- ...integ.existingFargateService.expected.json | 39 +++++- .../test/integ.existingVpc.expected.json | 39 +++++- ...nteg.fargateServiceFromProps.expected.json | 39 +++++- .../test/integ.noArguments.expected.json | 39 +++++- .../test/integ.vpcFromprops.expected.json | 39 +++++- .../aws-fargate-s3/lib/index.ts | 5 + .../test/integ.new-resources.expected.json | 43 +++++- .../aws-iot-kinesisfirehose-s3/lib/index.ts | 5 + .../integ.customLoggingBucket.expected.json | 37 +++++- .../test/integ.no-arguments.expected.json | 37 +++++- .../test/test.iot-kinesisfirehose-s3.test.ts | 4 +- .../aws-iot-s3/lib/index.ts | 5 + ....iot-s3-new-encrypted-bucket.expected.json | 37 +++++- .../lib/index.ts | 5 + .../integ.customLoggingBucket.expected.json | 37 +++++- .../test/integ.no-arguments.expected.json | 37 +++++- ...isfirehose-s3-and-kinesisanalytics.test.ts | 4 +- .../aws-kinesisfirehose-s3/lib/index.ts | 5 + .../integ.customLoggingBucket.expected.json | 37 +++++- .../test/integ.no-arguments.expected.json | 37 +++++- .../test/kinesisfirehose-s3.test.ts | 4 +- .../aws-kinesisstreams-gluejob/lib/index.ts | 5 + .../test/integ.code-asset-job.expected.json | 37 +++++- .../test/integ.no-arguments.expected.json | 37 +++++- .../test/kinesisstream-gluejob.test.ts | 10 +- .../lib/index.ts | 5 + .../integ.customLoggingBucket.expected.json | 37 +++++- .../test/integ.no-arguments.expected.json | 37 +++++- .../kinesisstreams-kinesisfirehose-s3.test.ts | 4 +- .../integ.existing-function.expected.json | 39 +++++- .../test/integ.existing-vpc.expected.json | 39 +++++- .../test/integ.new-vpc.expected.json | 39 +++++- .../test/integ.no-arguments.expected.json | 39 +++++- .../aws-lambda-s3/lib/index.ts | 5 + .../integ.customLoggingBucket.expected.json | 37 +++++- .../integ.deployFunctionWithVpc.expected.json | 4 +- .../test/integ.existingFunction.expected.json | 37 +++++- .../aws-lambda-s3/test/lambda-s3.test.ts | 4 +- .../aws-s3-lambda/lib/index.ts | 5 + .../test/integ.no-arguments.expected.json | 123 ++++++++++++++++++ .../aws-s3-lambda/test/integ.no-arguments.ts | 4 +- .../aws-s3-lambda/test/s3-lambda.test.ts | 4 +- .../aws-s3-sns/lib/index.ts | 5 + .../integ.customLoggingBucket.expected.json | 37 +++++- .../test/integ.existingSnsTopic.expected.json | 37 +++++- ....existingUnencryptedSnsTopic.expected.json | 37 +++++- .../integ.newTopicFromProps.expected.json | 37 +++++- .../test/integ.noArguments.expected.json | 37 +++++- ...integ.s3EventTypesAndFilters.expected.json | 37 +++++- ...eg.snsTopicWithAwsManagedKey.expected.json | 37 +++++- .../aws-s3-sns/test/test.s3-sns.test.ts | 1 + .../aws-s3-sqs/lib/index.ts | 5 + .../integ.customLoggingBucket.expected.json | 37 +++++- .../test/integ.noArguments.expected.json | 37 +++++- .../aws-s3-sqs/test/test.s3-sqs.test.ts | 4 +- .../aws-s3-stepfunctions/lib/index.ts | 5 + .../integ.customLoggingBucket.expected.json | 37 +++++- .../test/s3-stepfunctions.test.ts | 1 + .../lib/cloudfront-distribution-helper.ts | 19 ++- .../core/lib/s3-bucket-helper.ts | 3 - .../cdk-integ-tools/bin/cdk-integ-assert.ts | 1 + source/tools/cdk-integ-tools/bin/cdk-integ.ts | 1 + 89 files changed, 1895 insertions(+), 173 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json index a37d75a11..0812a32fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json @@ -589,13 +589,13 @@ "cfapigwlambdaCloudFrontToApiGatewaySetHttpSecurityHeadersE20F2933": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc8273ed23dc12ef2b23814ad425355213a41659e4f", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8273ed23dc12ef2b23814ad425355213a41659e4f", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc8273ed23dc12ef2b23814ad425355213a41659e4f", + "AutoPublish": true } }, "cfapigwlambdaCloudFrontToApiGatewayCloudfrontLoggingBucket2E8E3DC2": { @@ -611,6 +611,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -884,7 +891,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json index 9a02cb007..35f2917d1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json @@ -589,13 +589,13 @@ "testcloudfrontapigatewaylambdaCloudFrontToApiGatewaySetHttpSecurityHeaders6945414A": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc8118ca6b46a588ddfb2f1826effa6addb3adda75e", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8118ca6b46a588ddfb2f1826effa6addb3adda75e", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc8118ca6b46a588ddfb2f1826effa6addb3adda75e", + "AutoPublish": true } }, "testcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudfrontLoggingBucket7F467421": { @@ -611,6 +611,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -884,7 +891,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json index b636fe56f..789660449 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json @@ -550,13 +550,13 @@ "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeaders67E61E6E": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc82a9e79410026b75533b53f0a37eeb986a591fa95", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc82a9e79410026b75533b53f0a37eeb986a591fa95", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc82a9e79410026b75533b53f0a37eeb986a591fa95", + "AutoPublish": true } }, "cfapilambdaoverrideCloudFrontToApiGatewayCloudfrontLoggingBucket3A71B9E0": { @@ -572,6 +572,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -923,7 +930,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts index 975fe8fb5..a44bffeee 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts @@ -227,7 +227,7 @@ test('Cloudfront logging bucket with destroy removal policy and auto delete obje const template = Template.fromStack(stack); template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" + OwnershipControls: { Rules: [ { ObjectOwnership: "ObjectWriter" } ] }, }); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json index 8bdb9fdbc..e422b9d00 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json @@ -589,13 +589,13 @@ "cfapigwSetHttpSecurityHeaders07A0F0C0": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc8fc067b45a5c199a519a90c3b5f02d380f1625f1d", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8fc067b45a5c199a519a90c3b5f02d380f1625f1d", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc8fc067b45a5c199a519a90c3b5f02d380f1625f1d", + "AutoPublish": true } }, "cfapigwCloudfrontLoggingBucket79FE4195": { @@ -611,6 +611,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -884,7 +891,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json index 77291c962..821ffb388 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json @@ -589,13 +589,13 @@ "testcloudfrontapigatewaySetHttpSecurityHeadersD8DBA642": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc86815c5ef0b0f2cdd73c6957ce5bbd25e8f895b9b", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc86815c5ef0b0f2cdd73c6957ce5bbd25e8f895b9b", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc86815c5ef0b0f2cdd73c6957ce5bbd25e8f895b9b", + "AutoPublish": true } }, "testcloudfrontapigatewayCloudfrontLoggingBucket9811F6E8": { @@ -611,6 +611,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -884,7 +891,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts index 99492e6f4..d7ad60d05 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts @@ -193,7 +193,7 @@ test('Cloudfront logging bucket with destroy removal policy and auto delete obje const template = Template.fromStack(stack); template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" + OwnershipControls: { Rules: [ { ObjectOwnership: "ObjectWriter" } ] }, }); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts index 6e7d5586f..73363676c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts @@ -665,7 +665,7 @@ test('Cloudfront logging bucket with destroy removal policy and auto delete obje const template = Template.fromStack(stack); template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" + OwnershipControls: { Rules: [ { ObjectOwnership: "ObjectWriter" } ] }, }); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json index 44221344e..cd0f01a50 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json @@ -95,6 +95,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -269,13 +276,13 @@ "cloudfrontmediastoreSetHttpSecurityHeadersC55C3265": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc80b17555ef95835e434ce55c4536b557a9baf1262", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc80b17555ef95835e434ce55c4536b557a9baf1262", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc80b17555ef95835e434ce55c4536b557a9baf1262", + "AutoPublish": true } }, "cloudfrontmediastoreCloudFrontDistribution639346BB": { @@ -410,7 +417,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json index 9b73d4b49..232164d28 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json @@ -95,6 +95,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -269,13 +276,13 @@ "testcloudfrontmediastoreSetHttpSecurityHeaders9995A63D": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc85e0befbf4ed85d473981453c3bd34f0a97efbe49", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc85e0befbf4ed85d473981453c3bd34f0a97efbe49", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc85e0befbf4ed85d473981453c3bd34f0a97efbe49", + "AutoPublish": true } }, "testcloudfrontmediastoreCloudFrontDistributionED9265B1": { @@ -410,7 +417,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json index 6df3c639e..1d05dc108 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json @@ -20,6 +20,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -194,13 +201,13 @@ "testcloudfrontmediastoreSetHttpSecurityHeaders9995A63D": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc8671d40ce388b672e8795a9218fe7e3f368379f42", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8671d40ce388b672e8795a9218fe7e3f368379f42", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc8671d40ce388b672e8795a9218fe7e3f368379f42", + "AutoPublish": true } }, "testcloudfrontmediastoreCloudFrontDistributionED9265B1": { @@ -327,7 +334,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json index bc79291e8..1e2c8a88f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json @@ -59,6 +59,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -233,13 +240,13 @@ "testcloudfrontmediastoreSetHttpSecurityHeaders9995A63D": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc8f338626119f90653fe964a54eb18cb4a8d6406ce", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8f338626119f90653fe964a54eb18cb4a8d6406ce", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc8f338626119f90653fe964a54eb18cb4a8d6406ce", + "AutoPublish": true } }, "testcloudfrontmediastoreCloudFrontDistributionED9265B1": { @@ -369,7 +376,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withSecurityHeaderBehavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withSecurityHeaderBehavior.expected.json index c56445571..5d05ca67e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withSecurityHeaderBehavior.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withSecurityHeaderBehavior.expected.json @@ -95,6 +95,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json index 5c9253b9b..9c651e913 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json @@ -95,6 +95,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -387,7 +394,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts index cbbfc3b54..9e720bb25 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts @@ -106,6 +106,11 @@ export class CloudFrontToS3 extends Construct { */ constructor(scope: Construct, id: string, props: CloudFrontToS3Props) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); let bucket: s3.IBucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json index 6de2e1d2e..47d50ea9e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json @@ -4,7 +4,6 @@ "testcloudfronts3S3LoggingBucket90D239DD": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testcloudfronts3S3BucketE0C5F76E", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testcloudfronts3S3LoggingBucket90D239DD", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -276,13 +311,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc824484dfea4176847245e871498ffd7e454223fe4", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc824484dfea4176847245e871498ffd7e454223fe4", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc824484dfea4176847245e871498ffd7e454223fe4", + "AutoPublish": true } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -298,6 +333,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -539,7 +581,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json index b7ae8fd09..8443b2707 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json @@ -4,18 +4,6 @@ "MyFunction3BAA72D1": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": { - "Fn::Join": [ - "", - [ - { - "Ref": "AWS::Region" - }, - "customsecurityheadersMyFunctionFAC550FB" - ] - ] - }, - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; base-uri 'self'; img-src 'self'; script-src 'self'; style-src 'self' https:; object-src 'none'; frame-ancestors 'none'; font-src 'self' https:; form-action 'self'; manifest-src 'self'; connect-src 'self'\" }; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; headers['referrer-policy'] = { value: 'same-origin' }; return response; }", "FunctionConfig": { "Comment": { @@ -30,13 +18,24 @@ ] }, "Runtime": "cloudfront-js-1.0" - } + }, + "Name": { + "Fn::Join": [ + "", + [ + { + "Ref": "AWS::Region" + }, + "customsecurityheadersMyFunctionFAC550FB" + ] + ] + }, + "AutoPublish": true } }, "testcloudfronts3S3LoggingBucket90D239DD": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -110,6 +109,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testcloudfronts3S3BucketE0C5F76E", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testcloudfronts3S3LoggingBucket90D239DD", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -308,13 +343,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc8132e0ba07d4c8fdbdb431ae46eef456c0589cb21", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8132e0ba07d4c8fdbdb431ae46eef456c0589cb21", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc8132e0ba07d4c8fdbdb431ae46eef456c0589cb21", + "AutoPublish": true } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -330,6 +365,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -570,7 +612,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json index 6e2ca764c..059909150 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json @@ -4,7 +4,6 @@ "testcloudfronts3S3LoggingBucket90D239DD": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testcloudfronts3S3BucketE0C5F76E", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testcloudfronts3S3LoggingBucket90D239DD", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -276,13 +311,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc88d4d30b2e66a3bd009aa7f11e35596ee70824ece", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc88d4d30b2e66a3bd009aa7f11e35596ee70824ece", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc88d4d30b2e66a3bd009aa7f11e35596ee70824ece", + "AutoPublish": true } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -298,6 +333,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -538,7 +580,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json index f48956258..be6d27194 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json @@ -3,7 +3,6 @@ "testcloudfronts3S3LoggingBucket90D239DD": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -122,6 +121,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testcloudfronts3S3BucketE0C5F76E", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testcloudfronts3S3LoggingBucket90D239DD", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -339,13 +374,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc8adfb824ff76ff8867fe60ef9e02c0d312ebd9f83", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8adfb824ff76ff8867fe60ef9e02c0d312ebd9f83", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc8adfb824ff76ff8867fe60ef9e02c0d312ebd9f83", + "AutoPublish": true } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -361,6 +396,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -601,7 +643,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json index 7a7c730a9..51c7d8b77 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json @@ -204,7 +204,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, @@ -254,13 +254,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc87bceb93c12dbe589df4f4994a0258334a9b78e4a", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc87bceb93c12dbe589df4f4994a0258334a9b78e4a", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc87bceb93c12dbe589df4f4994a0258334a9b78e4a", + "AutoPublish": true } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -276,6 +276,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json index 5bd334b60..ff20b45dc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json @@ -198,13 +198,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "Name": "SetHttpSecurityHeadersc8075c5215eb89e52dc0db6c01788e90b8e754531c", - "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8075c5215eb89e52dc0db6c01788e90b8e754531c", "Runtime": "cloudfront-js-1.0" - } + }, + "Name": "SetHttpSecurityHeadersc8075c5215eb89e52dc0db6c01788e90b8e754531c", + "AutoPublish": true } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -220,6 +220,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -460,7 +467,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json index 9f46d2543..c232f3e04 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json @@ -4,7 +4,6 @@ "testcloudfronts3nosecurityheadersS3LoggingBucketF644B35F": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testcloudfronts3nosecurityheadersS3Bucket4D06173D", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testcloudfronts3nosecurityheadersS3LoggingBucketF644B35F", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -286,6 +321,13 @@ } ] }, + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -515,7 +557,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts index 2a68ec16a..c4e1ee100 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts @@ -255,19 +255,21 @@ test('test cloudfront with custom domain names', () => { test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { const stack = new cdk.Stack(); + const testName = "test-name"; new CloudFrontToS3(stack, 'cloudfront-s3', { bucketProps: { removalPolicy: cdk.RemovalPolicy.DESTROY, }, loggingBucketProps: { removalPolicy: cdk.RemovalPolicy.DESTROY, - autoDeleteObjects: true + autoDeleteObjects: true, + bucketName: testName } }); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" + BucketName: testName }); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { @@ -289,16 +291,19 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { test('Cloudfront logging bucket with destroy removal policy and auto delete objects', () => { const stack = new cdk.Stack(); + const cloudfrontLogBucketName = 'cf-log-bucket'; new CloudFrontToS3(stack, 'cloudfront-s3', { cloudFrontLoggingBucketProps: { removalPolicy: cdk.RemovalPolicy.DESTROY, - autoDeleteObjects: true + autoDeleteObjects: true, + bucketName: cloudfrontLogBucketName } }); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" + OwnershipControls: { Rules: [ { ObjectOwnership: "ObjectWriter" } ] }, + BucketName: cloudfrontLogBucketName, }); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/lib/index.ts index 07a0b0d2b..00e634d20 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/lib/index.ts @@ -103,6 +103,11 @@ export class EventbridgeToKinesisFirehoseToS3 extends Construct { */ constructor(scope: Construct, id: string, props: EventbridgeToKinesisFirehoseToS3Props) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); // Set up the Kinesis Firehose using KinesisFirehoseToS3 construct diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts index e770f7125..f15b1394a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts @@ -232,9 +232,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" - }); + template.resourceCountIs("AWS::S3::Bucket", 2); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { ServiceToken: { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json index 5aca88db1..b9f4c55de 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json @@ -3,7 +3,6 @@ "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-no-arguments.expected.json index ddcb7844c..c5bfb2b37 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-no-arguments.expected.json @@ -4,7 +4,6 @@ "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket703E6C44": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket703E6C44", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json index 623a813f8..d8c3cb9d1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json @@ -836,7 +836,6 @@ "destinationfirehoseS3LoggingBucket19A32AC0": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -954,6 +953,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "destinationfirehoseS3BucketEC05EE08", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "destinationfirehoseS3LoggingBucket19A32AC0", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -1348,7 +1383,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "3f51abb709b8e65167a45aeed02bab11540603d909005d7148230ba5ce6c74d7.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json index 07767fc58..34063939e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json @@ -836,7 +836,6 @@ "destinationfirehoseS3LoggingBucket19A32AC0": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -954,6 +953,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "destinationfirehoseS3BucketEC05EE08", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "destinationfirehoseS3LoggingBucket19A32AC0", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -1348,7 +1383,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "3f51abb709b8e65167a45aeed02bab11540603d909005d7148230ba5ce6c74d7.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json index 9bba1a9a4..5f8c82564 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json @@ -3,7 +3,6 @@ "destinationfirehoseS3LoggingBucket19A32AC0": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -121,6 +120,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "destinationfirehoseS3BucketEC05EE08", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "destinationfirehoseS3LoggingBucket19A32AC0", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -515,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "3f51abb709b8e65167a45aeed02bab11540603d909005d7148230ba5ce6c74d7.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json index e0d611e4d..feeed0e4e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json @@ -3,7 +3,6 @@ "destinationfirehoseS3LoggingBucket19A32AC0": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -121,6 +120,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "destinationfirehoseS3BucketEC05EE08", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "destinationfirehoseS3LoggingBucket19A32AC0", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -511,7 +546,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "3f51abb709b8e65167a45aeed02bab11540603d909005d7148230ba5ce6c74d7.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json index 6e3bd4f4b..ada3efa1f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json @@ -3,7 +3,6 @@ "destinationfirehoseS3LoggingBucket19A32AC0": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -121,6 +120,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "destinationfirehoseS3BucketEC05EE08", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "destinationfirehoseS3LoggingBucket19A32AC0", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -515,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "3f51abb709b8e65167a45aeed02bab11540603d909005d7148230ba5ce6c74d7.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts index 78463e6de..37830ff0e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts @@ -156,6 +156,11 @@ export class FargateToS3 extends Construct { constructor(scope: Construct, id: string, props: FargateToS3Props) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); defaults.CheckFargateProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json index 38f229063..decf2394b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json @@ -4,7 +4,6 @@ "testconstructS3LoggingBucketD59856DF": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testconstructS3Bucket81E8552A", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testconstructS3LoggingBucketD59856DF", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -887,7 +922,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -903,7 +937,8 @@ "Key": "Name", "Value": "new-resources/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "VpcS3A5408339": { @@ -1343,7 +1378,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/lib/index.ts index 50b6490e8..97431270c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/lib/index.ts @@ -91,6 +91,11 @@ export class IotToKinesisFirehoseToS3 extends Construct { */ constructor(scope: Construct, id: string, props: IotToKinesisFirehoseToS3Props) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); const firehoseToS3 = new KinesisFirehoseToS3(this, 'KinesisFirehoseToS3', { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json index 640dee782..f141a4769 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json @@ -3,7 +3,6 @@ "testiotkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket03F0BA8E": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testiotkinesisfirehoses3KinesisFirehoseToS3S3BucketAEE2D91B", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testiotkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket03F0BA8E", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json index 42359c02d..b1b5c1364 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json @@ -4,7 +4,6 @@ "testiotfirehoses3KinesisFirehoseToS3S3LoggingBucketC786B050": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testiotfirehoses3KinesisFirehoseToS3S3Bucket19C97D09", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testiotfirehoses3KinesisFirehoseToS3S3LoggingBucketC786B050", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts index 0c3476afd..d9bb4f85a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts @@ -182,9 +182,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" - }); + template.resourceCountIs("AWS::S3::Bucket", 2); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { ServiceToken: { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts index 51e6e278b..5afb9a05c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts @@ -77,6 +77,11 @@ export class IotToS3 extends Construct { */ constructor(scope: Construct, id: string, props: IotToS3Props) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); // Setup S3 Bucket diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json index 2915c0cc5..95a67bf11 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json @@ -39,7 +39,6 @@ "testiots3integrationS3LoggingBucket606446CC": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -113,6 +112,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testiots3integrationS3Bucket9B8B180C", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testiots3integrationS3LoggingBucket606446CC", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts index d90ede8e0..8798c43e8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts @@ -93,6 +93,11 @@ export class KinesisFirehoseToAnalyticsAndS3 extends Construct { */ constructor(scope: Construct, id: string, props: KinesisFirehoseToAnalyticsAndS3Props) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); // Setup the kinesisfirehose-s3 pattern diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json index 4ef30965a..c57d17329 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json @@ -3,7 +3,6 @@ "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json index b19498fb1..b7f3ed208 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json @@ -3,7 +3,6 @@ "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -77,6 +76,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts index 2ba2f4e18..c172d05b1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts @@ -159,9 +159,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" - }); + template.resourceCountIs("AWS::S3::Bucket", 2); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { ServiceToken: { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts index d3940b414..18319b5b7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts @@ -89,6 +89,11 @@ export class KinesisFirehoseToS3 extends Construct { */ constructor(scope: Construct, id: string, props: KinesisFirehoseToS3Props) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); const firehoseId = 'KinesisFirehose'; diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json index 333bc21d1..8863865ec 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json @@ -3,7 +3,6 @@ "testkinesisfirehoses3S3LoggingBucketDD0F9F56": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testkinesisfirehoses3S3BucketA8942735", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3S3LoggingBucketDD0F9F56", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json index 604ad54b8..f321ef9d2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json @@ -4,7 +4,6 @@ "testfirehoses3S3LoggingBucket31BFDC22": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testfirehoses3S3Bucket93480488", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testfirehoses3S3LoggingBucket31BFDC22", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts index 42a0737a0..9c1cc7ea0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts @@ -236,9 +236,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" - }); + template.resourceCountIs("AWS::S3::Bucket", 2); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { ServiceToken: { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts index daa211c06..8dc65de36 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts @@ -168,6 +168,11 @@ export class KinesisstreamsToGluejob extends Construct { */ constructor(scope: Construct, id: string, props: KinesisstreamsToGluejobProps) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); // custom props check diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json index 7b90bddd5..705c0fe01 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json @@ -210,7 +210,6 @@ "testkinesisstreamslambdaS3LoggingBucket48F70267": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -284,6 +283,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testkinesisstreamslambdaS3Bucket54759F5C", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisstreamslambdaS3LoggingBucket48F70267", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json index 5da9ccc78..f18b6a9c1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json @@ -203,7 +203,6 @@ "testkinesisstreamslambdaS3LoggingBucket48F70267": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -277,6 +276,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testkinesisstreamslambdaS3Bucket54759F5C", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisstreamslambdaS3LoggingBucket48F70267", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts index 2a26f2370..e45c954bf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts @@ -716,10 +716,6 @@ test('When Asset for local file is defined', () => { const id = 'test-kinesisstreams-lambda'; const construct = new KinesisstreamsToGluejob(stack, id, props); - expect(construct.outputBucket).toBeDefined(); - expect(construct.outputBucket![0]).toBeDefined(); - expect(construct.outputBucket![1]).toBeDefined(); - // Check for properties expect(construct.database).toBeDefined(); expect(construct.glueJob).toBeDefined(); @@ -727,8 +723,14 @@ test('When Asset for local file is defined', () => { expect(construct.kinesisStream).toBeDefined(); expect(construct.glueJobRole).toBeDefined(); expect(construct.cloudwatchAlarms).toBeDefined(); + expect(construct.outputBucket).toBeDefined(); + expect(construct.outputBucket![0]).toBeDefined(); + expect(construct.outputBucket![1]).toBeDefined(); + // Each output bucket should have a logging bucket const template = Template.fromStack(stack); + template.resourceCountIs("AWS::S3::Bucket", 2); + template.hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts index 8707b1fac..d71a2bc79 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts @@ -112,6 +112,11 @@ export class KinesisStreamsToKinesisFirehoseToS3 extends Construct { */ constructor(scope: Construct, id: string, props: KinesisStreamsToKinesisFirehoseToS3Props) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); // Setup the Kinesis Stream diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json index a902352c9..2fbc46ba6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json @@ -17,7 +17,6 @@ "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -92,6 +91,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json index aadbad27e..8b46f7bdb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json @@ -18,7 +18,6 @@ "teststreamfirehoses3KinesisFirehoseToS3S3LoggingBucketFB87BEBC": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -92,6 +91,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "teststreamfirehoses3KinesisFirehoseToS3S3Bucket315B67A3", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "teststreamfirehoses3KinesisFirehoseToS3S3LoggingBucketFB87BEBC", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts index b7a53748d..5659bf6e1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts @@ -204,9 +204,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" - }); + template.resourceCountIs("AWS::S3::Bucket", 2); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { ServiceToken: { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json index bfc3e06fb..27eef443e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json @@ -3,7 +3,6 @@ "destinationfirehoseS3LoggingBucket19A32AC0": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -121,6 +120,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "destinationfirehoseS3BucketEC05EE08", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "destinationfirehoseS3LoggingBucket19A32AC0", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -515,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "3f51abb709b8e65167a45aeed02bab11540603d909005d7148230ba5ce6c74d7.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json index 0dea42cab..82b3555ee 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json @@ -3,7 +3,6 @@ "destinationfirehoseS3LoggingBucket19A32AC0": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -121,6 +120,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "destinationfirehoseS3BucketEC05EE08", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "destinationfirehoseS3LoggingBucket19A32AC0", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -515,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "3f51abb709b8e65167a45aeed02bab11540603d909005d7148230ba5ce6c74d7.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json index 403c97f9f..abdfd3683 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json @@ -3,7 +3,6 @@ "destinationfirehoseS3LoggingBucket19A32AC0": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -121,6 +120,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "destinationfirehoseS3BucketEC05EE08", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "destinationfirehoseS3LoggingBucket19A32AC0", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -515,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "3f51abb709b8e65167a45aeed02bab11540603d909005d7148230ba5ce6c74d7.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json index ad6ca77f5..6f7734d7f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json @@ -3,7 +3,6 @@ "destinationfirehoseS3LoggingBucket19A32AC0": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -121,6 +120,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "destinationfirehoseS3BucketEC05EE08", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "destinationfirehoseS3LoggingBucket19A32AC0", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" @@ -515,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "3f51abb709b8e65167a45aeed02bab11540603d909005d7148230ba5ce6c74d7.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts index 4b8cec0ac..92c805d0d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts @@ -109,6 +109,11 @@ export class LambdaToS3 extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToS3Props) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); if (props.bucketPermissions) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json index 2ed044729..37e83bd90 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json @@ -181,7 +181,6 @@ "testlambdas3S3LoggingBucketD42FC73D": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -256,6 +255,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testlambdas3S3Bucket179A52E6", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testlambdas3S3LoggingBucketD42FC73D", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json index c52d3448b..058678598 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json @@ -598,7 +598,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -614,7 +613,8 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "VpcS3A5408339": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json index 3285914cf..36099ea36 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json @@ -182,7 +182,6 @@ "testlambdas3S3LoggingBucketD42FC73D": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -256,6 +255,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testlambdas3S3Bucket179A52E6", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testlambdas3S3LoggingBucketD42FC73D", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts index 2b1522287..de17381ff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts @@ -393,9 +393,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" - }); + template.resourceCountIs("AWS::S3::Bucket", 2); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { ServiceToken: { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts index d9e25271b..ba1d1a59e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts @@ -84,6 +84,11 @@ export class S3ToLambda extends Construct { */ constructor(scope: Construct, id: string, props: S3ToLambdaProps) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); let bucket: s3.Bucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json index 10c85e0e7..c60da90fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json @@ -138,6 +138,124 @@ } } }, + "tests3lambdaS3LoggingBucket0C3BBFDC": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + }, + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W35", + "reason": "This S3 bucket is used as the access logging bucket for another bucket" + } + ] + } + } + }, + "tests3lambdaS3LoggingBucketPolicyC349F74C": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "tests3lambdaS3LoggingBucket0C3BBFDC" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3lambdaS3LoggingBucket0C3BBFDC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3lambdaS3LoggingBucket0C3BBFDC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3lambdaS3BucketBE7C1B8E", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3lambdaS3LoggingBucket0C3BBFDC", + "Arn" + ] + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + }, "tests3lambdaS3BucketBE7C1B8E": { "Type": "AWS::S3::Bucket", "Properties": { @@ -163,6 +281,11 @@ } ] }, + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "tests3lambdaS3LoggingBucket0C3BBFDC" + } + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts index 85b7b0ce0..f63575983 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts @@ -33,7 +33,9 @@ const props: S3ToLambdaProps = { bucketProps: { removalPolicy: RemovalPolicy.DESTROY, }, - logS3AccessLogs: false + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + }, }; const construct = new S3ToLambda(stack, 'test-s3-lambda', props); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts index ba766158b..6a1a3ea8d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts @@ -87,9 +87,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" - }); + template.resourceCountIs("AWS::S3::Bucket", 2); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { ServiceToken: { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts index 807a3fc14..207622f86 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts @@ -124,6 +124,11 @@ export class S3ToSns extends Construct { */ constructor(scope: Construct, id: string, props: S3ToSnsProps) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); // If the enableEncryptionWithCustomerManagedKey is undefined, default it to true diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json index 739b14151..a47e32a2a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json @@ -3,7 +3,6 @@ "tests3snsS3LoggingBucket94DE93BC": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -77,6 +76,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json index 89663b3fd..2182fa528 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json @@ -166,7 +166,6 @@ "tests3snsS3LoggingBucket94DE93BC": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -240,6 +239,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingUnencryptedSnsTopic.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingUnencryptedSnsTopic.expected.json index 51aed0c35..d9190d342 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingUnencryptedSnsTopic.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingUnencryptedSnsTopic.expected.json @@ -52,7 +52,6 @@ "tests3snsS3LoggingBucket94DE93BC": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -126,6 +125,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json index 26c04e4f0..fe7840adc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json @@ -3,7 +3,6 @@ "tests3snsS3LoggingBucket94DE93BC": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -77,6 +76,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json index 739b14151..a47e32a2a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json @@ -3,7 +3,6 @@ "tests3snsS3LoggingBucket94DE93BC": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -77,6 +76,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json index 981a7972c..1608bdc30 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json @@ -3,7 +3,6 @@ "tests3snsS3LoggingBucket94DE93BC": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -77,6 +76,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.snsTopicWithAwsManagedKey.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.snsTopicWithAwsManagedKey.expected.json index 6bd113e9a..f7f6e850d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.snsTopicWithAwsManagedKey.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.snsTopicWithAwsManagedKey.expected.json @@ -3,7 +3,6 @@ "tests3snsS3LoggingBucket94DE93BC": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -77,6 +76,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts index 9b821fc1f..7a45685ad 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts @@ -48,6 +48,7 @@ test('construct creates default event notification', () => { ] } }); + template.resourceCountIs("AWS::S3::Bucket", 2); }); test('construct uses existingBucketObj property', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts index e64fe714b..cd41a50e0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts @@ -134,6 +134,11 @@ export class S3ToSqs extends Construct { */ constructor(scope: Construct, id: string, props: S3ToSqsProps) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); let bucket: s3.Bucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json index d6704e7c3..2406f51ef 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json @@ -3,7 +3,6 @@ "tests3sqsS3LoggingBucket0B0BC86A": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3sqsS3BucketFF76CDA6", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3sqsS3LoggingBucket0B0BC86A", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json index f7a74ef0b..4df7ea0f0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json @@ -3,7 +3,6 @@ "tests3sqsS3LoggingBucket0B0BC86A": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -77,6 +76,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3sqsS3BucketFF76CDA6", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3sqsS3LoggingBucket0B0BC86A", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts index 5800e30d8..34521e7ce 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts @@ -257,9 +257,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::S3::Bucket", { - AccessControl: "LogDeliveryWrite" - }); + template.resourceCountIs("AWS::S3::Bucket", 2); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { ServiceToken: { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts index 098f00fce..0ef8ec2fe 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts @@ -101,6 +101,11 @@ export class S3ToStepfunctions extends Construct { */ constructor(scope: Construct, id: string, props: S3ToStepfunctionsProps) { super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + defaults.CheckProps(props); let bucket: s3.IBucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json index 568575791..11241541f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json @@ -3,7 +3,6 @@ "tests3stepfunctionsS3LoggingBucketF7586A92": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -78,6 +77,42 @@ ] } ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3stepfunctionsS3Bucket2B08AD28", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3stepfunctionsS3LoggingBucketF7586A92", + "Arn" + ] + }, + "/*" + ] + ] + } } ], "Version": "2012-10-17" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts index e773e4cab..c4cd1a914 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts @@ -155,6 +155,7 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { const template = Template.fromStack(stack); template.hasResourceProperties("Custom::S3BucketNotifications", {}); + template.resourceCountIs("AWS::S3::Bucket", 2); template.hasResourceProperties("Custom::S3AutoDeleteObjects", { ServiceToken: { diff --git a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts index ddf73c3af..d0e51e6df 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts @@ -26,7 +26,7 @@ import { DefaultCloudFrontWebDistributionForApiGatewayProps, DefaultCloudFrontDisributionForMediaStoreProps } from './cloudfront-distribution-defaults'; -import { overrideProps, addCfnSuppressRules, consolidateProps } from './utils'; +import { addCfnSuppressRules, consolidateProps } from './utils'; import { createLoggingBucket } from './s3-bucket-helper'; import { DefaultS3Props } from './s3-bucket-defaults'; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate @@ -245,12 +245,21 @@ function getLoggingBucket( throw Error('Either cloudFrontDistributionProps.logBucket or cloudFrontLoggingBucketProps can be set.'); } - return isLoggingDisabled - ? undefined - : userSuppliedLogBucket ?? createLoggingBucket( + let bucketResult: s3.Bucket | undefined; + if (isLoggingDisabled) { + bucketResult = undefined; + } else if (userSuppliedLogBucket) { + bucketResult = userSuppliedLogBucket; + } else { + bucketResult = createLoggingBucket( scope, 'CloudfrontLoggingBucket', - cloudFrontLoggingBucketProps ? overrideProps(DefaultS3Props(), cloudFrontLoggingBucketProps) : DefaultS3Props()); + consolidateProps(DefaultS3Props(), cloudFrontLoggingBucketProps, { objectOwnership: s3.ObjectOwnership.OBJECT_WRITER })); + + const loggingBucketResource = bucketResult.node.findChild('Resource') as s3.CfnBucket; + loggingBucketResource.addPropertyOverride('AccessControl', 'LogDeliveryWrite'); + } + return bucketResult; } function getCloudfrontFunction(httpSecurityHeaders: boolean, scope: Construct) { diff --git a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts index 7a8a87549..89b6dce02 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts @@ -62,9 +62,6 @@ export function createLoggingBucket(scope: Construct, // Extract the CfnBucket from the loggingBucket const loggingBucketResource = loggingBucket.node.findChild('Resource') as s3.CfnBucket; - // Override accessControl configuration and add metadata for the logging bucket - loggingBucketResource.addPropertyOverride('AccessControl', 'LogDeliveryWrite'); - // Remove the default LifecycleConfiguration for the Logging Bucket loggingBucketResource.addPropertyDeletionOverride('LifecycleConfiguration.Rules'); diff --git a/source/tools/cdk-integ-tools/bin/cdk-integ-assert.ts b/source/tools/cdk-integ-tools/bin/cdk-integ-assert.ts index b3988bafd..1dc74efb9 100644 --- a/source/tools/cdk-integ-tools/bin/cdk-integ-assert.ts +++ b/source/tools/cdk-integ-tools/bin/cdk-integ-assert.ts @@ -29,6 +29,7 @@ async function main() { let actual = await test.cdkSynthFast( deepmerge(DEFAULT_SYNTH_OPTIONS, { context: { + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true, "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, diff --git a/source/tools/cdk-integ-tools/bin/cdk-integ.ts b/source/tools/cdk-integ-tools/bin/cdk-integ.ts index cefb65289..7d9ebb693 100644 --- a/source/tools/cdk-integ-tools/bin/cdk-integ.ts +++ b/source/tools/cdk-integ-tools/bin/cdk-integ.ts @@ -77,6 +77,7 @@ async function main() { const actual = await test.cdkSynthFast( deepmerge(DEFAULT_SYNTH_OPTIONS, { context: { + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true, "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, From 5df448f41e75491aefa4f02efbde9c17656457a3 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Sun, 16 Apr 2023 12:01:00 +0000 Subject: [PATCH 07/73] chore(release): 2.38.0 --- CHANGELOG.md | 7 +++++++ source/lerna.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ea918318..bfe2fe012 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.38.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.37.0...v2.38.0) (2023-04-16) + + +### Bug Fixes + +* **s3-constructs:** accommodate s3 change that disables acls by default ([#949](https://github.com/awslabs/aws-solutions-constructs/issues/949)) ([46d02cc](https://github.com/awslabs/aws-solutions-constructs/commit/46d02ccf98e368206b59c27a16003dc3b16d4236)) + ## [2.37.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.36.0...v2.37.0) (2023-04-11) Built on CDK v2.73.0 diff --git a/source/lerna.json b/source/lerna.json index e3a06aed7..84db77c3f 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.37.0" + "version": "2.38.0" } From b559f1480a69b85f5f291b4041dc8467a23d637c Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 16 Apr 2023 08:03:55 -0400 Subject: [PATCH 08/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfe2fe012..e2b3b4b6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file. See [standa ## [2.38.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.37.0...v2.38.0) (2023-04-16) +Build on CDK v2.74.0 ### Bug Fixes From 21fa8b792ca69b4a57694f9ae85196a898ecd9de Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 16 Apr 2023 08:03:57 -0400 Subject: [PATCH 09/73] chore(version): Upgraded CDK --- deployment/v2/align-version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v2/align-version.js b/deployment/v2/align-version.js index 3cf60a7a6..4b61a5c8e 100755 --- a/deployment/v2/align-version.js +++ b/deployment/v2/align-version.js @@ -10,7 +10,7 @@ const findVersion = process.argv[2]; const replaceVersion = process.argv[3]; // these versions need to be sourced from a config file -const awsCdkLibVersion = '2.73.0'; +const awsCdkLibVersion = '2.74.0'; const constructsVersion = '10.0.0'; const MODULE_EXEMPTIONS = new Set([ '@aws-cdk/cloudformation-diff', From 3e46579ef02e726143cf437be293c9435d013f5f Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Sat, 22 Apr 2023 22:26:18 -0400 Subject: [PATCH 10/73] Implement GeneratePhysicalName (#954) --- .../test/eventbridge-stepfunctions.test.ts | 25 ---------- ...ge-stepfunctions-no-argument.expected.json | 22 ++++++++- ...g.eventbridge-stepfunctions-no-argument.ts | 1 - .../test/fargate-stepfunctions.test.ts | 26 ---------- .../test/integ.new-resources.expected.json | 22 ++++++++- .../test/integ.new-resources.ts | 1 - .../test/integ.deploy-lambda.expected.json | 22 ++++++++- .../test/integ.deploy-lambda.ts | 1 - .../test/lambda-stepfunctions.test.ts | 38 --------------- ...s3-stepfunctions-no-argument.expected.json | 22 ++++++++- .../integ.s3-stepfunctions-no-argument.ts | 1 - .../test/s3-stepfunctions.test.ts | 25 ---------- .../core/lib/step-function-helper.ts | 8 ++-- .../core/lib/utils.ts | 47 ++++++++++++++++++- .../core/test/step-function-helper.test.ts | 17 ++----- .../core/test/utils.test.ts | 20 ++++++++ 16 files changed, 159 insertions(+), 139 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts index 31e00a159..6c6eb9c2c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts @@ -197,28 +197,3 @@ test('check custom event bus resource with props when deploy:true', () => { Name: 'testcustomeventbus' }); }); - -test('check LogGroup name', () => { - const stack = new cdk.Stack(); - - deployNewStateMachine(stack); - - // Perform some fancy stuff to examine the specifics of the LogGroupName - const expectedPrefix = '/aws/vendedlogs/states/constructs/'; - const lengthOfDatetimeSuffix = 13; - - const template = Template.fromStack(stack); - const LogGroup = template.findResources("AWS::Logs::LogGroup"); - - const logName = LogGroup.testeventbridgestepfunctionsStateMachineLogGroup826A5B74.Properties.LogGroupName; - const suffix = logName.slice(-lengthOfDatetimeSuffix); - - // Look for the expected Prefix and the 13 digit time suffix - expect(logName.slice(0, expectedPrefix.length)).toEqual(expectedPrefix); - expect(IsWholeNumber(suffix)).not.toBe(false); -}); - -function IsWholeNumber(target: string): boolean { - const numberPattern = /[0-9]{13}/; - return target.match(numberPattern) !== null; -} diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json index 0c108fa64..bb8778950 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json @@ -3,7 +3,27 @@ "testeventbridgestepfunctionsconstructStateMachineLogGroup3098B32C": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "integ-test-no-arguments" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/eventbridge-stepfunctions-no-argumenttest-eventbridge-stepfunctions-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.ts index cd487eaa8..9d43105b1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.ts @@ -33,7 +33,6 @@ const props: EventbridgeToStepfunctionsProps = { }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "integ-test-no-arguments" }, }; diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts index e33e2461b..c265b78ec 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts @@ -321,29 +321,3 @@ function testStateMachineProps(stack: cdk.Stack, userProps?: stepfunctions.State return defaults.consolidateProps(defaultTestProp, userProps); } - -test('check LogGroup name', () => { - const stack = new cdk.Stack(); - const publicApi = true; - - createFargateConstructWithNewResources(stack, publicApi); - - // Perform some fancy stuff to examine the specifics of the LogGroupName - const expectedPrefix = '/aws/vendedlogs/states/constructs/'; - const lengthOfDatetimeSuffix = 13; - - const template = Template.fromStack(stack); - const LogGroup = template.findResources("AWS::Logs::LogGroup"); - - const logName = LogGroup.testconstructStateMachineLogGroup2EB4F48B.Properties.LogGroupName; - const suffix = logName.slice(-lengthOfDatetimeSuffix); - - // Look for the expected Prefix and the 13 digit time suffix - expect(logName.slice(0, expectedPrefix.length)).toEqual(expectedPrefix); - expect(IsWholeNumber(suffix)).not.toBe(false); -}); - -function IsWholeNumber(target: string): boolean { - const numberPattern = /[0-9]{13}/; - return target.match(numberPattern) !== null; -} diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json index 2c7a36d6d..f8b2fa26e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json @@ -1076,7 +1076,27 @@ "testconstructStateMachineLogGroup2EB4F48B": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "with-lambda" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/new-resourcestest-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts index 45619476f..3543ba05f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts @@ -50,7 +50,6 @@ const constructProps: FargateToStepfunctionsProps = { stateMachineEnvironmentVariableName: 'CUSTOM_NAME', logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "with-lambda" } }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json index cf8519009..5d32965b4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json @@ -3,7 +3,27 @@ "testlambdastepfunctionsconstructStateMachineLogGroup1FD4C0D4": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "with-lambda" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/deploy-lambdatest-lambda-stepfunctions-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts index 7bf44dcb1..d1578b19e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts @@ -37,7 +37,6 @@ const props: LambdaToStepfunctionsProps = { }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "with-lambda" } }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts index 040fdc55c..cf9fbc33b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts @@ -469,41 +469,3 @@ test("Test bad call with existingVpc and deployVpc", () => { // Assertion expect(app).toThrowError(); }); - -test('check LogGroup name', () => { - // Stack - const stack = new Stack(); - // Helper declaration - const startState = new stepfunctions.Pass(stack, 'StartState'); - new LambdaToStepfunctions(stack, 'lambda-to-step-function-stack', { - lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_16_X, - handler: 'index.handler', - code: lambda.Code.fromAsset(`${__dirname}/lambda`), - environment: { - LAMBDA_NAME: 'existing-function' - } - }, - stateMachineProps: { - definition: startState - } - }); - // Perform some fancy stuff to examine the specifics of the LogGroupName - const expectedPrefix = '/aws/vendedlogs/states/constructs/'; - const lengthOfDatetimeSuffix = 13; - - const template = Template.fromStack(stack); - const LogGroup = template.findResources("AWS::Logs::LogGroup"); - - const logName = LogGroup.lambdatostepfunctionstackStateMachineLogGroupEAD4854E.Properties.LogGroupName; - const suffix = logName.slice(-lengthOfDatetimeSuffix); - - // Look for the expected Prefix and the 13 digit time suffix - expect(logName.slice(0, expectedPrefix.length)).toEqual(expectedPrefix); - expect(IsWholeNumber(suffix)).not.toBe(false); -}); - -function IsWholeNumber(target: string): boolean { - const numberPattern = /[0-9]{13}/; - return target.match(numberPattern) !== null; -} diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json index 456f580d9..c2d6d28e0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json @@ -116,7 +116,27 @@ "tests3stepfunctionsconstructtests3stepfunctionsconstructeventrulestepfunctionconstructStateMachineLogGroupE86C2CF5": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "with-lambda" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/s3-stepfunctions-no-argumenttest-s3-stepfunctions-construct-event-rule-step-function-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.ts index 184941c9d..e79e25c07 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.ts @@ -33,7 +33,6 @@ const props: S3ToStepfunctionsProps = { }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "with-lambda" }, logS3AccessLogs: false }; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts index c4cd1a914..927f09213 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts @@ -191,28 +191,3 @@ test('s3 bucket with no logging bucket', () => { template.hasResourceProperties("Custom::S3BucketNotifications", {}); expect(construct.s3LoggingBucket).toEqual(undefined); }); - -test('check LogGroup name', () => { - const stack = new cdk.Stack(); - - deployNewStateMachine(stack); - - // Perform some fancy stuff to examine the specifics of the LogGroupName - const expectedPrefix = '/aws/vendedlogs/states/constructs/'; - const lengthOfDatetimeSuffix = 13; - - const template = Template.fromStack(stack); - const LogGroup = template.findResources("AWS::Logs::LogGroup"); - - const logName = LogGroup.tests3stepfunctionstests3stepfunctionseventrulestepfunctionconstructStateMachineLogGroupB4555776.Properties.LogGroupName; - const suffix = logName.slice(-lengthOfDatetimeSuffix); - - // Look for the expected Prefix and the 13 digit time suffix - expect(logName.slice(0, expectedPrefix.length)).toEqual(expectedPrefix); - expect(IsWholeNumber(suffix)).not.toBe(false); -}); - -function IsWholeNumber(target: string): boolean { - const numberPattern = /[0-9]{13}/; - return target.match(numberPattern) !== null; -} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/step-function-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/step-function-helper.ts index ea62e10a8..8ae409523 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/step-function-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/step-function-helper.ts @@ -21,7 +21,7 @@ import * as logs from 'aws-cdk-lib/aws-logs'; import * as cdk from 'aws-cdk-lib'; import * as smDefaults from './step-function-defaults'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; -import { overrideProps, generateResourceName, addCfnSuppressRules } from './utils'; +import { overrideProps, addCfnSuppressRules, generatePhysicalName } from './utils'; import * as iam from 'aws-cdk-lib/aws-iam'; import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch'; import { buildLogGroup } from './cloudwatch-log-group-helper'; @@ -59,16 +59,18 @@ export function buildStateMachine(scope: Construct, stateMachineProps: sfn.State if (!consolidatedLogGroupProps) { consolidatedLogGroupProps = {}; } + + const maxLogGroupNameLength = 255; if (!consolidatedLogGroupProps?.logGroupName) { const logGroupPrefix = '/aws/vendedlogs/states/constructs/'; - const maxResourceNameLength = 255 - logGroupPrefix.length; + const maxGeneratedNameLength = maxLogGroupNameLength - logGroupPrefix.length; const nameParts: string[] = [ cdk.Stack.of(scope).stackName, // Name of the stack scope.node.id, // Construct ID 'StateMachineLog' // Literal string for log group name portion ]; - const logGroupName = logGroupPrefix + generateResourceName(nameParts, maxResourceNameLength, true); + const logGroupName = generatePhysicalName(logGroupPrefix, nameParts, maxGeneratedNameLength); consolidatedLogGroupProps = overrideProps(consolidatedLogGroupProps, { logGroupName }); } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/utils.ts b/source/patterns/@aws-solutions-constructs/core/lib/utils.ts index 2b13ad0ed..6789d9cbb 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/utils.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/utils.ts @@ -104,7 +104,9 @@ export function printWarning(message: string) { /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. * - * @summary Creates a resource name in the style of the CDK (string+hash) + * @summary Creates a resource name in the style of the CDK (string+hash) - this value should be used for logical IDs, but + * not Physical Names, as it will not be static within a single stack instance lifetime, or it will not be different in + * different stack instances * @param {string[]} parts - the various string components of the name (eg - stackName, solutions construct ID, L2 construct ID) * @param {number} maxLength - the longest string that can be returned * @returns {string} - a string with concatenated parts (truncated if neccessary) + a hash of the full concatenated parts @@ -135,6 +137,49 @@ export function generateResourceName( return finalName.toLowerCase(); } +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + * + * @summary Creates a physical resource name in the style of the CDK (string+hash) - this value incorporates Stack ID, + * so it will remain static in multiple updates of a single stack, but will be different in a separate stack instance + * @param {string[]} parts - the various string components of the name (eg - stackName, solutions construct ID, L2 construct ID) + * @param {number} maxLength - the longest string that can be returned + * @returns {string} - a string with concatenated parts (truncated if neccessary) + a hash of the full concatenated parts + * + */ +export function generatePhysicalName( + prefix: string, + parts: string[], + maxLength: number, +): string { + // The result will consist of: + // -The prefix - unaltered + // -The parts concatenated, but reduced in size to meet the maxLength limit for the overall name + // -A hyphen delimiter + // -The GUID portion of the stack arn + + const stackIdGuidLength = 36; + const prefixLength = prefix.length; + const maxPartsLength = maxLength - prefixLength - 1 - stackIdGuidLength; // 1 is the hyphen + + // Extract the Stack ID Guid + const uniqueStackIdPart = cdk.Fn.select(2, cdk.Fn.split('/', `${cdk.Aws.STACK_ID}`)); + + let allParts: string = ''; + + parts.forEach((part) => { + allParts += part; + }); + + if (allParts.length > maxPartsLength) { + const subStringLength = maxPartsLength / 2; + allParts = allParts.substring(0, subStringLength) + allParts.substring(allParts.length - subStringLength); + } + + const finalName = prefix.toLowerCase() + allParts + '-' + uniqueStackIdPart; + return finalName; +} + /** * Removes all non-alphanumeric characters in a string. */ diff --git a/source/patterns/@aws-solutions-constructs/core/test/step-function-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/step-function-helper.test.ts index 4de810912..001858ac2 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/step-function-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/step-function-helper.test.ts @@ -194,7 +194,7 @@ test('Test deployment with custom role', () => { test('Confirm format of name', () => { // Stack - const stack = new Stack(); + const stack = new Stack(undefined, 'teststack'); // Step function definition const startState = new sfn.Pass(stack, 'StartState'); // Build state machine @@ -211,19 +211,10 @@ test('Confirm format of name', () => { }); // Perform some fancy stuff to examine the specifics of the LogGroupName - const expectedPrefix = '/aws/vendedlogs/states/constructs/'; - const lengthOfDatetimeSuffix = 13; - const LogGroup = template.findResources("AWS::Logs::LogGroup"); const logName = LogGroup.StateMachineLogGroup15B91BCB.Properties.LogGroupName; - const suffix = logName.slice(-lengthOfDatetimeSuffix); - // Look for the expected Prefix and the 13 digit time suffix - expect(logName.slice(0, expectedPrefix.length)).toEqual(expectedPrefix); - expect(IsWholeNumber(suffix)).not.toBe(false); + expect(logName['Fn::Join']).toBeDefined(); + expect(logName['Fn::Join'].length).toEqual(2); + expect(logName['Fn::Join'][1][1]['Fn::Select'][1]['Fn::Split'][1].Ref).toEqual("AWS::StackId"); }); - -function IsWholeNumber(target: string): boolean { - const numberPattern = /[0-9]{13}/; - return target.match(numberPattern) !== null; -} diff --git a/source/patterns/@aws-solutions-constructs/core/test/utils.test.ts b/source/patterns/@aws-solutions-constructs/core/test/utils.test.ts index 72de0c7eb..6597b2154 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/utils.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/utils.test.ts @@ -64,6 +64,26 @@ test('Test generateResourceName with randomized extension', () => { }); +test('Test generatePhysicalName', () => { + const result = defaults.generatePhysicalName('/aws/vendedlogs/states/constructs/', parts, 255); + + // The token number is not constant, so need to be flexible checking this value + const regex = /\/aws\/vendedlogs\/states\/constructs\/firstportionislongsecondsection-\${Token\[TOKEN\.[0-9]+\]}/; + expect(result).toMatch(regex); +}); + +test('Test truncation of generatePhysicalName', () => { + const longParts = [ ...parts, ...parts, ...parts, ...parts, ...parts ]; + const prefix = '/aws/vendedlogs/states/constructs/'; + const lengthOfGuid = 36; + const maxNameLength = 125; + + const result = defaults.generatePhysicalName(prefix, longParts, maxNameLength); + + const fixedPortion = result.split('$')[0]; + expect(fixedPortion.length).toEqual(maxNameLength - lengthOfGuid); +}); + test('Test generateIntegStackName', () => { const result = defaults.generateIntegStackName('integ.apigateway-dynamodb-CRUD.js'); expect(result).toContain('apigateway-dynamodb-CRUD'); From 6f42abe5c4b5ae6a24677032efa650eac78d20c9 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Sun, 23 Apr 2023 13:00:46 +0000 Subject: [PATCH 11/73] chore(release): 2.39.0 --- CHANGELOG.md | 2 ++ source/lerna.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2b3b4b6c..ca814e481 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.39.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.38.0...v2.39.0) (2023-04-23) + ## [2.38.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.37.0...v2.38.0) (2023-04-16) Build on CDK v2.74.0 diff --git a/source/lerna.json b/source/lerna.json index 84db77c3f..adddd0b92 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.38.0" + "version": "2.39.0" } From b7c405c095f5913740e671cde6144d7594ac47c7 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 23 Apr 2023 09:06:53 -0400 Subject: [PATCH 12/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca814e481..95a754f43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. See [standa ## [2.39.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.38.0...v2.39.0) (2023-04-23) +Built on CDK v2.76.0 + +### Bug Fixes + +* **aws-*-stepfunctions:** generate stack specific physical log group name ([#945](https://github.com/awslabs/aws-solutions-constructs/issues/945)) ([3e46579](https://github.com/awslabs/aws-solutions-constructs/commit/3e46579ef02e726143cf437be293c9435d013f5f)) + ## [2.38.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.37.0...v2.38.0) (2023-04-16) Build on CDK v2.74.0 From c26f470df87f7aa34115832e560d2ec00d18b58a Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 23 Apr 2023 09:06:54 -0400 Subject: [PATCH 13/73] chore(version): Upgraded CDK --- deployment/v2/align-version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v2/align-version.js b/deployment/v2/align-version.js index 4b61a5c8e..4550e8a5c 100755 --- a/deployment/v2/align-version.js +++ b/deployment/v2/align-version.js @@ -10,7 +10,7 @@ const findVersion = process.argv[2]; const replaceVersion = process.argv[3]; // these versions need to be sourced from a config file -const awsCdkLibVersion = '2.74.0'; +const awsCdkLibVersion = '2.76.0'; const constructsVersion = '10.0.0'; const MODULE_EXEMPTIONS = new Set([ '@aws-cdk/cloudformation-diff', From 01239d41a725740cc5aa3da422febc3d8b957c57 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 23 Apr 2023 12:41:17 -0400 Subject: [PATCH 14/73] Update integration snapshots for CDK 2.76.0 --- .../test/integ.additional-request-templates.expected.json | 3 --- .../test/integ.apigateway-kinesis-overwrite.expected.json | 3 --- .../test/integ.custom-integration-responses.expected.json | 3 --- .../test/integ.no-arguments.expected.json | 3 --- ....eventbridge-kinesisstreams-existing-eventbus.expected.json | 3 --- .../integ.eventbridge-kinesisstreams-existing.expected.json | 3 --- ...integ.eventbridge-kinesisstreams-new-eventbus.expected.json | 3 --- ...integ.eventbridge-kinesisstreams-no-arguments.expected.json | 3 --- .../test/integ.existingFargateService.expected.json | 3 --- .../test/integ.existingVpc.expected.json | 3 --- .../test/integ.fargateServiceFromProps.expected.json | 3 --- .../test/integ.noArguments.expected.json | 3 --- .../test/integ.vpcFromProps.expected.json | 3 --- .../test/integ.existing-kinesisstream.expected.json | 3 --- .../test/integ.new-kinesisstream.expected.json | 3 --- .../test/integ.no-arguments.expected.json | 3 --- .../test/integ.code-asset-job.expected.json | 3 --- .../test/integ.existing-job.expected.json | 3 --- .../test/integ.no-arguments.expected.json | 3 --- .../test/integ.existing.expected.json | 3 --- .../test/integ.no-arguments.expected.json | 3 --- .../test/integ.existingLambda.expected.json | 3 --- .../test/integ.existingStreamWithCmk.expected.json | 3 --- .../test/integ.existingVpc.expected.json | 3 --- .../aws-lambda-kinesisstreams/test/integ.newVpc.expected.json | 3 --- .../test/integ.newVpcFromProps.expected.json | 3 --- .../test/integ.noArguments.expected.json | 3 --- 27 files changed, 81 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json index 140df25ef..b25627113 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json @@ -560,9 +560,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json index 5a145e8cf..4cb3f8ff3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json @@ -512,9 +512,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json index 32f03b4dd..4ead90e0f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json @@ -544,9 +544,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json index dc2d2b399..c59473e94 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json @@ -548,9 +548,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing-eventbus.expected.json index 77a6a13df..8ac3c17b4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing-eventbus.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing.expected.json index 33310bf83..7b52073cf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-new-eventbus.expected.json index 2eb34602b..188654d1b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-new-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-new-eventbus.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-no-arguments.expected.json index 5e0e7631c..62961abd1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-no-arguments.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json index e5757b1b2..810cc8994 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json @@ -1120,9 +1120,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json index 52c6e4a16..bc14d2b5a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json @@ -841,9 +841,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json index b1e6e1296..b24e7d147 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json @@ -8,9 +8,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json index b174eb3c8..62dd5c4b3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json @@ -8,9 +8,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json index f46abc294..d12c25b61 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json @@ -8,9 +8,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.existing-kinesisstream.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.existing-kinesisstream.expected.json index 25e5e1a00..2486dfc92 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.existing-kinesisstream.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.existing-kinesisstream.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.new-kinesisstream.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.new-kinesisstream.expected.json index b585dff9c..c2e180e81 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.new-kinesisstream.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.new-kinesisstream.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.no-arguments.expected.json index d908110cb..cecdc54ec 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.no-arguments.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json index 705c0fe01..f7039123d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json index 1ae8f0317..6910e303d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json @@ -89,9 +89,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json index f18b6a9c1..b11db6096 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json index 54790562d..a3f9dfb48 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json @@ -189,9 +189,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json index e706fe3a2..cf6bffe41 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json index c86be015d..7ebdbedd1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json @@ -162,9 +162,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json index a680ce63a..9bb8057c1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json @@ -49,9 +49,6 @@ "Arn" ] } - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json index 69d3f04b0..cef2eab71 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json @@ -940,9 +940,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json index 9eb5c221e..7f798590d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json @@ -227,9 +227,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json index 63776674e..fd977a1d1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json @@ -219,9 +219,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json index 7f7097d3f..c79909567 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json @@ -162,9 +162,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, From aabee8d573dba4dd5f8292901c98a092db91f229 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 23 Apr 2023 13:06:44 -0400 Subject: [PATCH 15/73] One more construct of 2.79 updates --- .../test/integ.customLoggingBucket.expected.json | 3 --- .../test/integ.existing-bucket.expected.json | 3 --- .../test/integ.existing-logging-bucket.expected.json | 3 --- .../test/integ.existingStreamObj.expected.json | 3 --- .../test/integ.no-arguments.expected.json | 3 --- 5 files changed, 15 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json index 2fbc46ba6..17ba9aba0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json @@ -8,9 +8,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json index dc35eb138..01616e5c9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json @@ -46,9 +46,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json index 94197fb35..b0ac9581b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json @@ -47,9 +47,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json index d533ff8b8..1fe2510bc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json index 8b46f7bdb..cc69403ef 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json @@ -9,9 +9,6 @@ "StreamEncryption": { "EncryptionType": "KMS", "KeyId": "alias/aws/kinesis" - }, - "StreamModeDetails": { - "StreamMode": "PROVISIONED" } } }, From 344f150c1f2595df0d08bb09212e528d21a83d02 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 1 May 2023 09:37:13 -0400 Subject: [PATCH 16/73] chore(all): address code smells identified by sonarqube (#960) * Address Code Smells * Clean up typos in fargate-dynamodb * Typos, remove undefined assignments * Typos * Typos * Update CloudFront Integ * Update Sonar Coverage List --- sonar-project.properties | 6 ++ .../aws-alb-fargate/lib/index.ts | 38 ++++--- .../aws-alb-fargate/test/alb-fargate.test.ts | 9 +- .../test/integ.all-existing-private-http.ts | 13 +-- .../aws-alb-lambda/lib/index.ts | 18 ++-- .../test/integ.privateApiExistingResources.ts | 18 ++-- .../test/integ.publicApiExistingResources.ts | 17 ++-- .../aws-apigateway-dynamodb/lib/index.ts | 9 +- ...ustomCloudfrontLoggingBucket.expected.json | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../integ.override-behavior.expected.json | 2 +- ...ustomCloudfrontLoggingBucket.expected.json | 2 +- .../test/integ.no-arguments.expected.json | 2 +- ...ustomCloudFrontLoggingBucket.expected.json | 2 +- .../test/integ.default.expected.json | 2 +- .../integ.existingContainer.expected.json | 2 +- .../integ.overrideProperties.expected.json | 2 +- .../integ.custom-originPath.expected.json | 2 +- ...nteg.custom-security-headers.expected.json | 2 +- ...ustomCloudFrontLoggingBucket.expected.json | 2 +- .../integ.customLoggingBucket.expected.json | 2 +- .../test/integ.existing-bucket.expected.json | 2 +- .../test/integ.no-arguments.expected.json | 2 +- .../test/integ.deploy-with-vpc.expected.json | 9 +- .../test/integ.no-arguments.expected.json | 5 +- .../aws-fargate-dynamodb/lib/index.ts | 20 ++-- .../test/fargate-dynamodb.test.ts | 48 ++++----- .../test/integ.existing-resources.ts | 15 ++- .../aws-fargate-eventbridge/lib/index.ts | 20 ++-- .../test/fargate-eventbridge.test.ts | 17 ++-- .../test/integ.existing-resources.ts | 13 +-- .../aws-fargate-kinesisfirehose/lib/index.ts | 22 ++--- .../test/aws-fargate-kinesisfirehose.test.ts | 23 +++-- .../test/integ.existingFargateService.ts | 13 +-- .../aws-fargate-kinesisstreams/lib/index.ts | 20 ++-- .../test/fargate-kinesisstreams.test.ts | 25 +++-- .../test/integ.existingFargateService.ts | 15 ++- .../aws-fargate-opensearch/lib/index.ts | 20 ++-- .../test/fargate-opensearch.test.ts | 32 +++--- .../integ.existing-resources.expected.json | 9 +- .../test/integ.existing-resources.ts | 15 ++- .../test/integ.new-resources.expected.json | 9 +- .../aws-fargate-s3/lib/index.ts | 20 ++-- .../aws-fargate-s3/test/fargate-s3.test.ts | 32 +++--- .../test/integ.existing-resources.ts | 15 ++- .../aws-fargate-secretsmanager/lib/index.ts | 20 ++-- .../test/fargate-secretsmanager.test.ts | 48 ++++----- .../test/integ.existing-resources.ts | 13 +-- .../aws-fargate-sns/lib/index.ts | 20 ++-- .../aws-fargate-sns/test/fargate-sns.test.ts | 30 +++--- .../test/integ.existing-resources.ts | 13 +-- .../aws-fargate-sqs/lib/index.ts | 20 ++-- .../aws-fargate-sqs/test/fargate-sqs.test.ts | 28 ++---- .../test/integ.existing-resources.ts | 15 ++- .../lib/index.ts | 20 ++-- .../test/fargate-ssmstringparameter.test.ts | 60 +++++------ .../test/integ.existing-resources.ts | 15 ++- .../aws-fargate-stepfunctions/lib/index.ts | 20 ++-- .../test/fargate-stepfunctions.test.ts | 25 +++-- .../test/integ.new-resources.ts | 15 ++- .../test/integ.no-cloudwatch-alarms.ts | 15 ++- .../aws-kinesisstreams-gluejob/lib/index.ts | 6 +- ...loyFunctionWithClusterConfig.expected.json | 9 +- ...eployFunctionWithExistingVpc.expected.json | 9 +- ...g.deployFunctionWithVpcProps.expected.json | 9 +- .../integ.deployToFiveZones.expected.json | 7 +- .../integ.disabledZoneAwareness.expected.json | 7 +- .../test/integ.domain-arguments.expected.json | 3 + .../test/integ.no-arguments.expected.json | 3 + .../aws-lambda-kinesisfirehose/lib/index.ts | 2 +- .../test/integ.cluster-config.expected.json | 9 +- ...nteg.disabled-zone-awareness.expected.json | 9 +- .../test/integ.domain-arguments.expected.json | 5 +- .../test/integ.existing-vpc.expected.json | 9 +- .../test/integ.no-arguments.expected.json | 5 +- .../test/integ.vpc-props.expected.json | 9 +- .../aws-route53-alb/lib/index.ts | 26 ++--- .../aws-wafwebacl-apigateway/lib/index.ts | 9 +- .../aws-wafwebacl-appsync/lib/index.ts | 9 +- .../core/lib/alb-helper.ts | 26 ++--- .../lib/cloudfront-distribution-helper.ts | 17 ++-- .../core/lib/cognito-helper.ts | 7 +- .../core/lib/elasticache-helper.ts | 2 +- .../core/lib/elasticsearch-defaults.ts | 3 + .../core/lib/fargate-helper.ts | 54 +++++----- .../core/lib/glue-job-helper.ts | 14 ++- .../core/lib/input-validation.ts | 4 +- .../core/lib/lambda-helper.ts | 9 +- .../core/lib/opensearch-defaults.ts | 3 + .../core/lib/override-warning-service.ts | 2 +- .../core/lib/utils.ts | 13 +-- .../core/test/alb-helper.test.ts | 48 ++++++--- .../core/test/elasticsearch-helper.test.ts | 3 + .../core/test/fargate-helper.test.ts | 99 ++++++++----------- .../core/test/input-validation.test.ts | 20 ++-- .../core/test/opensearch-helper.test.ts | 3 + 96 files changed, 702 insertions(+), 722 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index 77bc2e084..63bdcdbdb 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -45,6 +45,9 @@ sonar.javascript.lcov.reportPaths= \ source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/coverage/lcov.info, \ + source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/coverage/lcov.info, \ + source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/coverage/lcov.info, \ + source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-fargate-s3/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-fargate-sns/coverage/lcov.info, \ @@ -66,6 +69,8 @@ sonar.javascript.lcov.reportPaths= \ source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/coverage/lcov.info, \ + source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/coverage/lcov.info, \ + source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-s3/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/coverage/lcov.info, \ @@ -78,6 +83,7 @@ sonar.javascript.lcov.reportPaths= \ source/patterns/@aws-solutions-constructs/aws-route53-alb/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-route53-apigateway/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-s3-lambda/coverage/lcov.info, \ + source/patterns/@aws-solutions-constructs/aws-s3-sns/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-s3-sqs/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-sns-lambda/coverage/lcov.info, \ diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts index 21f461272..bee06a834 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts @@ -177,16 +177,14 @@ export class AlbToFargate extends Construct { }); // Set up the ALB - this.loadBalancer = defaults.ObtainAlb( - scope, - `${id}-lb`, - this.vpc, - props.publicApi, - props.existingLoadBalancerObj, - props.loadBalancerProps, - props.logAlbAccessLogs, - props.albLoggingBucketProps - ); + this.loadBalancer = defaults.ObtainAlb(scope, `${id}-lb`, { + vpc: this.vpc, + publicApi: props.publicApi, + existingLoadBalancerObj: props.existingLoadBalancerObj, + loadBalancerProps: props.loadBalancerProps, + logAccessLogs: props.logAlbAccessLogs, + loggingBucketProps: props.albLoggingBucketProps + }); const newListener: boolean = this.loadBalancer.listeners.length === 0; @@ -207,17 +205,15 @@ export class AlbToFargate extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts index 8cbbafaf1..cedb5437f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts @@ -132,11 +132,10 @@ test('Test existing load balancer, vpc, service', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn + }); const existingAlb = new elb.ApplicationLoadBalancer(stack, 'test-alb', { vpc: existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts index 574bb6fc1..8d616b24e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts @@ -30,15 +30,10 @@ const image = ecs.ContainerImage.fromRegistry('nginx'); const testExistingVpc = defaults.getTestVpc(stack); -const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - testExistingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, // contaainer definition props -); +const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: testExistingVpc, + clientContainerDefinitionProps: { image }, // contaainer definition props +}); const existingAlb = new elb.ApplicationLoadBalancer(stack, 'test-alb', { vpc: testExistingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts index 236039c42..147becab9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts @@ -132,16 +132,14 @@ export class AlbToLambda extends Construct { constructVpcProps: props.publicApi ? {} : { enableDnsHostnames: true, enableDnsSupport: true } }); - this.loadBalancer = defaults.ObtainAlb( - this, - id, - this.vpc, - props.publicApi, - props.existingLoadBalancerObj, - props.loadBalancerProps, - props.logAlbAccessLogs, - props.albLoggingBucketProps - ); + this.loadBalancer = defaults.ObtainAlb(this, id, { + vpc: this.vpc, + publicApi: props.publicApi, + existingLoadBalancerObj: props.existingLoadBalancerObj, + loadBalancerProps: props.loadBalancerProps, + logAccessLogs: props.logAlbAccessLogs, + loggingBucketProps: props.albLoggingBucketProps + }); // Obtain Lambda function for construct (existing or created) this.lambdaFunction = defaults.buildLambdaFunction(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts index c7a6e43bb..7e7f65092 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts @@ -44,14 +44,18 @@ const lambdaFunction = defaults.buildLambdaFunction(stack, { } }); -const loadBalancer = defaults.ObtainAlb(stack, 'existing-alb', myVpc, false, undefined, { - internetFacing: false, +const loadBalancer = defaults.ObtainAlb(stack, 'existing-alb', { vpc: myVpc, -}, -true, -{ - removalPolicy: RemovalPolicy.DESTROY, - autoDeleteObjects: true + publicApi: false, + loadBalancerProps: { + internetFacing: false, + vpc: myVpc, + }, + logAccessLogs: true, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true + } }); const props: AlbToLambdaProps = { diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts index d61bb786e..e4af149c1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts @@ -48,22 +48,19 @@ const lambdaFunction = defaults.buildLambdaFunction(stack, { }, }); -const loadBalancer = defaults.ObtainAlb( - stack, - "existing-alb", - myVpc, - false, - undefined, - { +const loadBalancer = defaults.ObtainAlb(stack, "existing-alb", { + vpc: myVpc, + publicApi: false, + loadBalancerProps: { internetFacing: false, vpc: myVpc, }, - true, - { + logAccessLogs: true, + loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true, } -); +}); const props: AlbToLambdaProps = { existingLambdaObj: lambdaFunction, diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts index 59ace2c14..05724b22d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts @@ -16,7 +16,6 @@ import * as iam from 'aws-cdk-lib/aws-iam'; import * as defaults from '@aws-solutions-constructs/core'; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate import { Construct } from 'constructs'; -import * as apigateway from 'aws-cdk-lib/aws-apigateway'; import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; import { getPartitionKeyNameFromTable } from '@aws-solutions-constructs/core'; import * as logs from 'aws-cdk-lib/aws-logs'; @@ -77,7 +76,7 @@ export interface ApiGatewayToDynamoDBProps { * * @default - [{statusCode:"200"},{statusCode:"500",responseTemplates:{"text/html":"Error"},selectionPattern:"500"}] */ - readonly createIntegrationResponses?: apigateway.IntegrationResponse[]; + readonly createIntegrationResponses?: api.IntegrationResponse[]; /** * Whether to deploy an API Gateway Method for GET HTTP operations on DynamoDB table (i.e. dynamodb:Query). * @@ -112,7 +111,7 @@ export interface ApiGatewayToDynamoDBProps { * * @default - [{statusCode:"200"},{statusCode:"500",responseTemplates:{"text/html":"Error"},selectionPattern:"500"}] */ - readonly readIntegrationResponses?: apigateway.IntegrationResponse[]; + readonly readIntegrationResponses?: api.IntegrationResponse[]; /** * Whether to deploy API Gateway Method for PUT HTTP operations on DynamoDB table (i.e. dynamodb:UpdateItem). * @@ -140,7 +139,7 @@ export interface ApiGatewayToDynamoDBProps { * * @default - [{statusCode:"200"},{statusCode:"500",responseTemplates:{"text/html":"Error"},selectionPattern:"500"}] */ - readonly updateIntegrationResponses?: apigateway.IntegrationResponse[]; + readonly updateIntegrationResponses?: api.IntegrationResponse[]; /** * Whether to deploy API Gateway Method for DELETE HTTP operations on DynamoDB table (i.e. dynamodb:DeleteItem). * @@ -176,7 +175,7 @@ export interface ApiGatewayToDynamoDBProps { * * @default - [{statusCode:"200"},{statusCode:"500",responseTemplates:{"text/html":"Error"},selectionPattern:"500"}] */ - readonly deleteIntegrationResponses?: apigateway.IntegrationResponse[]; + readonly deleteIntegrationResponses?: api.IntegrationResponse[]; /** * User provided props to override the default props for the CloudWatchLogs LogGroup. * diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json index 0812a32fa..cc66b6fb3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json @@ -589,7 +589,7 @@ "cfapigwlambdaCloudFrontToApiGatewaySetHttpSecurityHeadersE20F2933": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8273ed23dc12ef2b23814ad425355213a41659e4f", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json index 35f2917d1..1e8754d26 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json @@ -589,7 +589,7 @@ "testcloudfrontapigatewaylambdaCloudFrontToApiGatewaySetHttpSecurityHeaders6945414A": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8118ca6b46a588ddfb2f1826effa6addb3adda75e", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json index 789660449..d792ff6e5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json @@ -550,7 +550,7 @@ "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeaders67E61E6E": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc82a9e79410026b75533b53f0a37eeb986a591fa95", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json index e422b9d00..22fa397c5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json @@ -589,7 +589,7 @@ "cfapigwSetHttpSecurityHeaders07A0F0C0": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8fc067b45a5c199a519a90c3b5f02d380f1625f1d", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json index 821ffb388..38ad05408 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json @@ -589,7 +589,7 @@ "testcloudfrontapigatewaySetHttpSecurityHeadersD8DBA642": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc86815c5ef0b0f2cdd73c6957ce5bbd25e8f895b9b", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json index cd0f01a50..76033030b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json @@ -276,7 +276,7 @@ "cloudfrontmediastoreSetHttpSecurityHeadersC55C3265": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc80b17555ef95835e434ce55c4536b557a9baf1262", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json index 232164d28..530f6f340 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json @@ -276,7 +276,7 @@ "testcloudfrontmediastoreSetHttpSecurityHeaders9995A63D": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc85e0befbf4ed85d473981453c3bd34f0a97efbe49", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json index 1d05dc108..ecb3e9647 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json @@ -201,7 +201,7 @@ "testcloudfrontmediastoreSetHttpSecurityHeaders9995A63D": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8671d40ce388b672e8795a9218fe7e3f368379f42", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json index 1e2c8a88f..cc400e87a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json @@ -240,7 +240,7 @@ "testcloudfrontmediastoreSetHttpSecurityHeaders9995A63D": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8f338626119f90653fe964a54eb18cb4a8d6406ce", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json index 47d50ea9e..9520bb929 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json @@ -311,7 +311,7 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc824484dfea4176847245e871498ffd7e454223fe4", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json index 8443b2707..764d1b69b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json @@ -343,7 +343,7 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8132e0ba07d4c8fdbdb431ae46eef456c0589cb21", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json index 059909150..19295d6d5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json @@ -311,7 +311,7 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc88d4d30b2e66a3bd009aa7f11e35596ee70824ece", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json index be6d27194..d19c5976a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json @@ -374,7 +374,7 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8adfb824ff76ff8867fe60ef9e02c0d312ebd9f83", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json index 51c7d8b77..aba250e81 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json @@ -254,7 +254,7 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc87bceb93c12dbe589df4f4994a0258334a9b78e4a", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json index ff20b45dc..90c7acdf4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json @@ -198,7 +198,7 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { - "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", + "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { "Comment": "SetHttpSecurityHeadersc8075c5215eb89e52dc0db6c01788e90b8e754531c", "Runtime": "cloudfront-js-1.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json index 9164afb23..39c58a87b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json @@ -594,7 +594,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -624,6 +624,9 @@ "Ref": "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPool97EA2952" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "domaintest-7c94db", "EBSOptions": { "EBSEnabled": true, @@ -1061,7 +1064,6 @@ "Ref": "testddbstreamslambdaeskVpcB583E197" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "testddbstreamslambdaeskVpcFlowLogIAMRole8B3A466E", @@ -1077,7 +1079,8 @@ "Key": "Name", "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "testddbstreamslambdaeskDynamoDBStreamsToLambdaDynamoTableDD18004A": { diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json index 59a8b7d35..d5b6352f4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json @@ -524,7 +524,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -554,6 +554,9 @@ "Ref": "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPool97EA2952" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "domaintest-7c94db", "EBSOptions": { "EBSEnabled": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts index 270b479c9..b254086ef 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts @@ -164,17 +164,15 @@ export class FargateToDynamoDB extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts index 763d536a3..5324cd6fb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts @@ -350,15 +350,13 @@ test('Existing service/new table, public API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); const construct = new FargateToDynamoDB(stack, 'test-construct', { publicApi, @@ -501,15 +499,13 @@ test('Existing service/existing table, private API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); const existingTable = new dynamodb.Table(stack, 'MyTablet', { tableName, @@ -645,15 +641,13 @@ test('test error invalid table permission', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); const existingTable = new dynamodb.Table(stack, 'MyTablet', { tableName, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.ts index 264489203..a0bad484c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.ts @@ -30,15 +30,12 @@ const buildDynamoDBTableResponse = defaults.buildDynamoDBTable(stack, {}); const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { + image + }, +}); const constructProps: FargateToDynamoDBProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts index 346e89f6e..06b577b7f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts @@ -149,17 +149,15 @@ export class FargateToEventbridge extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts index 236ac53e3..780dca7ff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts @@ -77,15 +77,14 @@ test('Check for an existing service', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - { clusterName }, - defaults.fakeEcrRepoArn, - undefined, - { family: familyName }, - { containerName }, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientClusterProps: { clusterName }, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateTaskDefinitionProps: { family: familyName }, + clientContainerDefinitionProps: { containerName }, + clientFargateServiceProps: { serviceName } + }); new FargateToEventbridge(stack, 'test-construct', { publicApi, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.ts index 5efbcaa67..8a4f9e2f8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.ts @@ -28,15 +28,10 @@ stack.templateOptions.description = 'Integration Test with existing VPC, Service const existingVpc = getTestVpc(stack); const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { image }, +}); const existingEventBus = new events.EventBus(stack, 'existing-event-bus', { eventBusName: 'test' }); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts index 4595e58ac..42cee3e2b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts @@ -146,17 +146,15 @@ export class FargateToKinesisFirehose extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } @@ -177,7 +175,7 @@ export class FargateToKinesisFirehose extends Construct { // Configure environment variables const deliveryStreamEnvironmentVariableName = props.firehoseEnvironmentVariableName || 'FIREHOSE_DELIVERYSTREAM_NAME'; // We can use ! because we checked for a stream name on props.existingKinesisFirehose at the top of this function - this.container.addEnvironment(deliveryStreamEnvironmentVariableName, this.kinesisFirehose!.deliveryStreamName!); + this.container.addEnvironment(deliveryStreamEnvironmentVariableName, this.kinesisFirehose.deliveryStreamName!); } } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts index 1bcc39e87..3c35374d4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts @@ -648,15 +648,20 @@ test('Construct uses existingFargateServiceObject when provided', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test-existing-fargate-service', - existingVpc, - { clusterName: 'my-cluster' }, - defaults.fakeEcrRepoArn, - undefined, - { family: 'my-family' }, - { containerName: 'my-container' }, - { serviceName: 'my-service' } - ); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test-existing-fargate-service', { + constructVpc: existingVpc, + clientClusterProps: { clusterName: 'my-cluster' }, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateTaskDefinitionProps: { + family: 'my-family' + }, + clientContainerDefinitionProps: { + containerName: 'my-container' + }, + clientFargateServiceProps: { + serviceName: 'my-service' + } + }); new FargateToKinesisFirehose(stack, 'test-fargate-kinesisfirehose', { publicApi: false, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.ts index 2c020c87d..9575c78ac 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.ts @@ -27,15 +27,10 @@ const image = ecs.ContainerImage.fromRegistry('nginx'); const destination = GetTestFirehoseDestination(stack, 'destination-firehose'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { image }, +}); new FargateToKinesisFirehose(stack, 'test-fargate-kinesisstreams', { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts index 64eee4a29..b87cdb3a4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts @@ -170,17 +170,15 @@ export class FargateToKinesisStreams extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts index f4e41bfb9..ea17271b0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts @@ -552,15 +552,22 @@ test('Construct uses existingFargateServiceObject when provided', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test-existing-fargate-service', - existingVpc, - { clusterName: 'my-cluster' }, - defaults.fakeEcrRepoArn, - undefined, - { family: 'my-family' }, - { containerName: 'my-container' }, - { serviceName: 'my-service' } - ); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test-existing-fargate-service', { + constructVpc: existingVpc, + clientClusterProps: { + clusterName: 'my-cluster' + }, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateTaskDefinitionProps: { + family: 'my-family' + }, + clientContainerDefinitionProps: { + containerName: 'my-container' + }, + clientFargateServiceProps: { + serviceName: 'my-service' + } + }); new FargateToKinesisStreams(stack, 'test-fargate-kinesisstreams', { publicApi: false, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.ts index 82cc70c70..beac4a2d5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.ts @@ -24,15 +24,12 @@ const existingVpc = getTestVpc(stack); const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { + image + }, +}); new FargateToKinesisStreams(stack, 'test-fargate-kinesisstreams', { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts index 7013befbd..e38b9a469 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts @@ -160,17 +160,15 @@ export class FargateToOpenSearch extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts index 11298d431..277a64796 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts @@ -564,15 +564,13 @@ test('Existing service/new domain, public API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName: SERVICE_NAME }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName: SERVICE_NAME + } + }); new FargateToOpenSearch(stack, 'test-construct', { publicApi, @@ -647,15 +645,13 @@ test('Existing service/new domain, private API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName: SERVICE_NAME }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName: SERVICE_NAME + } + }); new FargateToOpenSearch(stack, 'test-construct', { publicApi, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json index 0ef3d92f0..d203de3c2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json @@ -651,7 +651,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -667,7 +666,8 @@ "Key": "Name", "Value": "existing-resources/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { @@ -1333,7 +1333,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -1372,6 +1372,9 @@ "Ref": "testconstructCognitoUserPoolA4991355" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "solution-constructs", "EBSOptions": { "EBSEnabled": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.ts index 8d6cf0643..46742cf3d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.ts @@ -28,15 +28,12 @@ stack.templateOptions.description = 'Integration Test with existing VPC, Service const existingVpc = getTestVpc(stack); const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { + image + }, +}); const testProps: FargateToOpenSearchProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json index 75a18dc14..531d51cc1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json @@ -311,7 +311,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -350,6 +350,9 @@ "Ref": "testconstructCognitoUserPoolA4991355" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "solution-constructs", "EBSOptions": { "EBSEnabled": true, @@ -1169,7 +1172,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1185,7 +1187,8 @@ "Key": "Name", "Value": "new-resources/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts index 37830ff0e..b852ccd5b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts @@ -182,17 +182,15 @@ export class FargateToS3 extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts index 616078488..a88b2c016 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts @@ -437,15 +437,13 @@ test('Existing service/new bucket, public API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); new FargateToS3(stack, 'test-construct', { publicApi, @@ -581,15 +579,13 @@ test('Existing service/existing bucket, private API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); const existingBucket = new s3.Bucket(stack, 'MyBucket', { bucketName diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts index e36f264e0..8ecb56e9c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts @@ -33,15 +33,12 @@ const existingBucket = defaults.CreateScrapBucket(stack, { const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { + image + }, +}); const testProps: FargateToS3Props = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts index 6e31f2a47..4b93937cc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts @@ -158,17 +158,15 @@ export class FargateToSecretsmanager extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts index 163853127..d1d2dd005 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts @@ -376,15 +376,13 @@ test('Existing service/new secret, public API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); new FargateToSecretsmanager(stack, 'test-construct', { publicApi, @@ -503,15 +501,13 @@ test('Existing service/existing secret, private API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); const existingSecretObj = defaults.buildSecretsManagerSecret(stack, 'secret', { secretName @@ -619,15 +615,13 @@ test('Test error invalid secret permission', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); const existingSecretObj = buildSecretsManagerSecret(stack, 'secret', {}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.ts index 0d18b520d..0b6f9c693 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.ts @@ -30,15 +30,10 @@ const existingSecretObj = defaults.buildSecretsManagerSecret(stack, 'secret', {} const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { image }, +}); const constructProps: FargateToSecretsmanagerProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts index c588a63ea..5db6f1ce9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts @@ -170,17 +170,15 @@ export class FargateToSns extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts index 198695ab1..3684666ae 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts @@ -200,15 +200,11 @@ test('Existing service/new topic, public API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { serviceName } + }); new FargateToSns(stack, 'test-construct', { publicApi, @@ -290,15 +286,13 @@ test('Existing service/existing topic, private API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); const existingTopic = new sns.Topic(stack, 'MyTopic', { topicName diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts index 4743214fa..96e96a46d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts @@ -31,15 +31,10 @@ addCfnSuppressRules(existingTopic, [ { id: "W47", reason: "Stub topic for placeh const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { image }, +}); const testProps: FargateToSnsProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts index 98cb0c95a..28cb40a7b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts @@ -199,17 +199,15 @@ export class FargateToSqs extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts index b415da564..092c50666 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts @@ -302,15 +302,11 @@ test('Existing service/new queue, public API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { serviceName } + }); new FargateToSqs(stack, 'test-construct', { publicApi, @@ -405,15 +401,11 @@ test('Existing service/existing queue, private API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { serviceName } + }); const existingQueue = new sqs.Queue(stack, 'MyQueue', { queueName diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.ts index 7f04e60d2..6a532da20 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.ts @@ -33,15 +33,12 @@ const existingQueue = new sqs.Queue(stack, 'test-queue', { const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { + image + }, +}); const testProps: FargateToSqsProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts index 3ba4a6a9f..69474adac 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts @@ -157,17 +157,15 @@ export class FargateToSsmstringparameter extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts index 9b46fb166..09ad54249 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts @@ -464,15 +464,13 @@ test('Existing service/new parameter store, public API, existing VPC', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); new FargateToSsmstringparameter(stack, 'test-construct', { publicApi, @@ -632,15 +630,11 @@ test('Existing service/existing parameter store, private API, existing VPC', () const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { serviceName } + }); const existingParameterStore = createSsmParameterStore(stack); @@ -768,15 +762,13 @@ test('Test error invalid string parameter permission', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); const existingStringParameterObj = createSsmParameterStore(stack); @@ -800,15 +792,11 @@ test('Test error no existing object or prop provided', () => { const existingVpc = defaults.getTestVpc(stack, publicApi); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { serviceName } + }); const app = () => { new FargateToSsmstringparameter(stack, 'test-construct', { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.ts index 2e4afa201..c9a97334d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.ts @@ -35,15 +35,12 @@ const existingStringParameterObj = new ssm.StringParameter(stack, 'Parameter', { const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { + image + }, +}); const constructProps: FargateToSsmstringparameterProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts index 3ae716eea..056c3f2d1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts @@ -155,17 +155,15 @@ export class FargateToStepfunctions extends Construct { // CheckFargateProps confirms that the container is provided this.container = props.existingContainerDefinitionObject!; } else { - const createFargateServiceResponse = defaults.CreateFargateService( - scope, - id, - this.vpc, - props.clusterProps, - props.ecrRepositoryArn, - props.ecrImageVersion, - props.fargateTaskDefinitionProps, - props.containerDefinitionProps, - props.fargateServiceProps - ); + const createFargateServiceResponse = defaults.CreateFargateService(scope, id, { + constructVpc: this.vpc, + clientClusterProps: props.clusterProps, + ecrRepositoryArn: props.ecrRepositoryArn, + ecrImageVersion: props.ecrImageVersion, + clientFargateTaskDefinitionProps: props.fargateTaskDefinitionProps, + clientContainerDefinitionProps: props.containerDefinitionProps, + clientFargateServiceProps: props.fargateServiceProps + }); this.service = createFargateServiceResponse.service; this.container = createFargateServiceResponse.containerDefinition; } diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts index c265b78ec..66910d5da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts @@ -64,15 +64,22 @@ test('Check for an existing service', () => { const existingVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - { clusterName }, - defaults.fakeEcrRepoArn, - undefined, - { family: familyName }, - { containerName }, - { serviceName }); + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientClusterProps: { + clusterName + }, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateTaskDefinitionProps: { + family: familyName + }, + clientContainerDefinitionProps: { + containerName + }, + clientFargateServiceProps: { + serviceName + } + }); new FargateToStepfunctions(stack, 'test-construct', { publicApi, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts index 3543ba05f..d880f3ab1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts @@ -29,15 +29,12 @@ const existingVpc = defaults.getTestVpc(stack); const startState = new stepfunctions.Pass(stack, 'StartState'); const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { + image + }, +}); const constructProps: FargateToStepfunctionsProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.ts index 14afcb378..8f74073a7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.ts @@ -29,15 +29,12 @@ const existingVpc = defaults.getTestVpc(stack); const startState = new stepfunctions.Pass(stack, 'StartState'); const image = ecs.ContainerImage.fromRegistry('nginx'); -const createFargateServiceResponse = defaults.CreateFargateService(stack, - 'test', - existingVpc, - undefined, - undefined, - undefined, - undefined, - { image }, -); +const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + clientContainerDefinitionProps: { + image + }, +}); const constructProps: FargateToStepfunctionsProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts index 8dc65de36..90322f731 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts @@ -219,9 +219,9 @@ export class KinesisstreamsToGluejob extends Construct { const buildGlueJobResponse = defaults.buildGlueJob(this, { existingCfnJob: props.existingGlueJob, glueJobProps: props.glueJobProps, - table: this.table!, - database: this.database!, - outputDataStore: props.outputDataStore!, + table: this.table, + database: this.database, + outputDataStore: props.outputDataStore, etlCodeAsset: props.etlCodeAsset }); this.glueJob = buildGlueJobResponse.job; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json index 8066cf458..93de4aae8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json @@ -523,7 +523,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -553,6 +553,9 @@ "Ref": "testlambdaelasticsearchkibana5CognitoUserPool4E321CD0" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "deploytestwithclusterconfig", "EBSOptions": { "EBSEnabled": true, @@ -937,7 +940,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -953,7 +955,8 @@ "Key": "Name", "Value": "deployFunctionWithClusterConfig/Vpc" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json index 722292d18..4c975e6fd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json @@ -650,7 +650,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -666,7 +665,8 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "testlambdaelasticsearchkibana4LambdaFunctionServiceRoleA52BB7F9": { @@ -1197,7 +1197,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -1227,6 +1227,9 @@ "Ref": "testlambdaelasticsearchkibana4CognitoUserPool37A5CDE1" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "deploytestwithexistingvpc", "EBSOptions": { "EBSEnabled": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json index 4e19e5267..5e5a2f7bd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json @@ -525,7 +525,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -555,6 +555,9 @@ "Ref": "testlambdaelasticsearchkibana3CognitoUserPoolEF0D5793" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "deploytestwithvpcprops", "EBSOptions": { "EBSEnabled": true, @@ -992,7 +995,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1008,7 +1010,8 @@ "Key": "Name", "Value": "deployFunctionWithVpcProps/Vpc" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json index 649cfa2fc..1bb85d0fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json @@ -557,6 +557,9 @@ "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "deploytestfivezones", "EBSOptions": { "EBSEnabled": true, @@ -994,7 +997,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1010,7 +1012,8 @@ "Key": "Name", "Value": "deployToFiveZones/Vpc" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json index 2adc5c262..13feed655 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json @@ -549,6 +549,9 @@ "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "disabledzoneawareness", "EBSOptions": { "EBSEnabled": true, @@ -877,7 +880,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -893,7 +895,8 @@ "Key": "Name", "Value": "disabledZoneAwareness/Vpc" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json index a6954270e..b751b62d9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json @@ -492,6 +492,9 @@ "Ref": "testlambdaelasticsearchkibana2CognitoUserPool9D73D9DA" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "domain-args-7c94", "EBSOptions": { "EBSEnabled": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json index b49298c56..91a42c69d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json @@ -492,6 +492,9 @@ "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "domain-args-9e54", "EBSOptions": { "EBSEnabled": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts index 21d666af3..6971f5946 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts @@ -128,7 +128,7 @@ export class LambdaToKinesisFirehose extends Construct { // Configure environment variables const deliveryStreamEnvironmentVariableName = props.firehoseEnvironmentVariableName || 'FIREHOSE_DELIVERYSTREAM_NAME'; // We can use ! because we checked for a stream name on props.existingKinesisFirehose at the top of this function - this.lambdaFunction.addEnvironment(deliveryStreamEnvironmentVariableName, this.kinesisFirehose!.deliveryStreamName!); + this.lambdaFunction.addEnvironment(deliveryStreamEnvironmentVariableName, this.kinesisFirehose.deliveryStreamName!); } } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json index 17537ccb2..1a1ecc48b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json @@ -523,7 +523,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -562,6 +562,9 @@ "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "deploytestwithclusterconfig", "EBSOptions": { "EBSEnabled": true, @@ -937,7 +940,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -953,7 +955,8 @@ "Key": "Name", "Value": "cluster-config/Vpc" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json index 075ed1368..1c7aa543e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json @@ -519,7 +519,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -555,6 +555,9 @@ "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "disabledzoneawareness", "EBSOptions": { "EBSEnabled": true, @@ -877,7 +880,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -893,7 +895,8 @@ "Key": "Name", "Value": "disabled-zone-awareness/Vpc" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json index cdf431648..c19cf238e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json @@ -462,7 +462,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -501,6 +501,9 @@ "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "solutions-constructs-domain", "EBSOptions": { "EBSEnabled": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json index 6f806022f..c8bf4c695 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json @@ -650,7 +650,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -666,7 +665,8 @@ "Key": "Name", "Value": "existing-vpc/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "testlambdaelasticsearchkibana4LambdaFunctionServiceRoleA52BB7F9": { @@ -1197,7 +1197,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -1236,6 +1236,9 @@ "Ref": "testlambdaelasticsearchkibana4CognitoUserPool37A5CDE1" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "deploytestwithexistingvpc", "EBSOptions": { "EBSEnabled": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json index 95f8a357e..7cb5c31f5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json @@ -462,7 +462,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -501,6 +501,9 @@ "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "solutions-constructs-domain", "EBSOptions": { "EBSEnabled": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json index 139b6889e..c1edf72a8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json @@ -525,7 +525,7 @@ "Ref": "AWS::Partition" }, ":es:", - { + { "Ref": "AWS::Region" }, ":", @@ -564,6 +564,9 @@ "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" } }, + "DomainEndpointOptions": { + "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" + }, "DomainName": "deploytestwithvpcprops", "EBSOptions": { "EBSEnabled": true, @@ -992,7 +995,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1008,7 +1010,8 @@ "Key": "Name", "Value": "vpc-props/Vpc" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts index c6ad44620..60a80a31e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts @@ -146,23 +146,25 @@ export class Route53ToAlb extends Construct { } } - this.loadBalancer = defaults.ObtainAlb( - this, - id, - this.vpc, - props.publicApi, - props.existingLoadBalancerObj, - props.loadBalancerProps, - props.logAlbAccessLogs, - props.albLoggingBucketProps - ); + this.loadBalancer = defaults.ObtainAlb(this, id, { + vpc: this.vpc, + publicApi: props.publicApi, + existingLoadBalancerObj: props.existingLoadBalancerObj, + loadBalancerProps: props.loadBalancerProps, + logAccessLogs: props.logAlbAccessLogs, + loggingBucketProps: props.albLoggingBucketProps + }); // Add the ALB to the HostedZone as a target const hostedZoneTarget = new r53t.LoadBalancerTarget(this.loadBalancer); - new r53.ARecord(this, `${id}-alias`, { + const arecordId = `${id}-alias`; + const arecordProps: r53.ARecordProps = { target: { aliasTarget: hostedZoneTarget }, zone: this.hostedZone - }); + }; + + // Before turning off SonarQube for the line, reduce the line to it's minimum + new r53.ARecord(this, arecordId, arecordProps); // NOSONAR } } diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts index e88e360e6..fd7f4dae5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts @@ -64,11 +64,14 @@ export class WafwebaclToApiGateway extends Construct { const resourceArn = `arn:${Aws.PARTITION}:apigateway:${Aws.REGION}::/restapis/${props.existingApiGatewayInterface.restApiId}/stages/${props.existingApiGatewayInterface.deploymentStage.stageName}`; - // Setup the Web ACL Association - new waf.CfnWebACLAssociation(scope, `${id}-WebACLAssociation`, { + const aclAssociationId = `${id}-WebACLAssociation`; + const aclAssociationProps: waf.CfnWebACLAssociationProps = { webAclArn: this.webacl.attrArn, resourceArn - }); + }; + + // Before turning off SonarQube for the line, reduce the line to it's minimum + new waf.CfnWebACLAssociation(scope, aclAssociationId, aclAssociationProps); // NOSONAR this.apiGateway = props.existingApiGatewayInterface; } diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts index 4dcf3d035..2215207ff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts @@ -61,11 +61,14 @@ export class WafwebaclToAppsync extends Construct { webaclProps: props.webaclProps, }); - // Setup the Web ACL Association - new waf.CfnWebACLAssociation(scope, `${id}-WebACLAssociation`, { + const aclAssociationId = `${id}-WebACLAssociation`; + const aclAssociationProps: waf.CfnWebACLAssociationProps = { webAclArn: this.webacl.attrArn, resourceArn: props.existingAppsyncApi.attrArn, - }); + }; + + // Before turning off SonarQube for the line, reduce the line to it's minimum + new waf.CfnWebACLAssociation(scope, aclAssociationId, aclAssociationProps); // NOSONAR this.appsyncApi = props.existingAppsyncApi; } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts index 8ecd2c749..05c245419 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts @@ -29,6 +29,15 @@ import { DefaultListenerProps } from "./alb-defaults"; import { createAlbLoggingBucket } from "./s3-bucket-helper"; import { DefaultLoggingBucketProps } from "./s3-bucket-defaults"; +export interface ObtainAlbProps { + readonly vpc: ec2.IVpc, + readonly publicApi: boolean, + readonly existingLoadBalancerObj?: elb.ApplicationLoadBalancer, + readonly loadBalancerProps?: elb.ApplicationLoadBalancerProps | any, + readonly logAccessLogs?: boolean, + readonly loggingBucketProps?: s3.BucketProps +} + /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. * @@ -38,26 +47,21 @@ import { DefaultLoggingBucketProps } from "./s3-bucket-defaults"; export function ObtainAlb( scope: Construct, id: string, - vpc: ec2.IVpc, - publicApi: boolean, - existingLoadBalancerObj?: elb.ApplicationLoadBalancer, - loadBalancerProps?: elb.ApplicationLoadBalancerProps | any, - logAccessLogs?: boolean, - loggingBucketProps?: s3.BucketProps + props: ObtainAlbProps ): elb.ApplicationLoadBalancer { let loadBalancer: elb.ApplicationLoadBalancer; - if (existingLoadBalancerObj) { - loadBalancer = existingLoadBalancerObj; + if (props.existingLoadBalancerObj) { + loadBalancer = props.existingLoadBalancerObj; } else { - const consolidatedProps = consolidateProps({}, loadBalancerProps, { vpc, internetFacing: publicApi }); + const consolidatedProps = consolidateProps({}, props.loadBalancerProps, { vpc: props.vpc, internetFacing: props.publicApi }); loadBalancer = new elb.ApplicationLoadBalancer( scope, `${id}-alb`, consolidatedProps ); - if (logAccessLogs === undefined || logAccessLogs === true) { - const consolidatedLoggingBucketProps = consolidateProps(DefaultLoggingBucketProps(), loggingBucketProps); + if (props.logAccessLogs === undefined || props.logAccessLogs === true) { + const consolidatedLoggingBucketProps = consolidateProps(DefaultLoggingBucketProps(), props.loggingBucketProps); const loggingBucket = createAlbLoggingBucket(scope, id, consolidatedLoggingBucketProps); loadBalancer.logAccessLogs(loggingBucket); } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts index d0e51e6df..15991ecfe 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts @@ -55,15 +55,14 @@ function defaultCloudfrontFunction(scope: Construct): cloudfront.Function { return new cloudfront.Function(scope, "SetHttpSecurityHeaders", { functionName: functionId, - code: cloudfront.FunctionCode.fromInline("function handler(event) { var response = event.response; \ - var headers = response.headers; \ - headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; \ - headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; \ - headers['x-content-type-options'] = { value: 'nosniff'}; \ - headers['x-frame-options'] = {value: 'DENY'}; \ - headers['x-xss-protection'] = {value: '1; mode=block'}; \ - return response; \ - }") + code: cloudfront.FunctionCode.fromInline("function handler(event) { " + + "var response = event.response; " + + "var headers = response.headers; " + + "headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; " + + "headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; " + + "headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; " + + "headers['x-xss-protection'] = {value: '1; mode=block'}; " + + "return response; }") }); } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/cognito-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/cognito-helper.ts index 1022b4137..1a30e5343 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/cognito-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/cognito-helper.ts @@ -128,12 +128,15 @@ export function setupCognitoForSearchService(scope: Construct, domainName: strin }); // Attach the IAM Role for Cognito Authorized Users - new cognito.CfnIdentityPoolRoleAttachment(scope, 'IdentityPoolRoleMapping', { + const props: cognito.CfnIdentityPoolRoleAttachmentProps = { identityPoolId: options.identitypool.ref, roles: { authenticated: cognitoAuthorizedRole.roleArn } - }); + }; + + // Minimize code in a NOSONA line + new cognito.CfnIdentityPoolRoleAttachment(scope, 'IdentityPoolRoleMapping', props); // NOSONAR return cognitoAuthorizedRole; } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/elasticache-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/elasticache-helper.ts index 6d5914bde..1fcfab913 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/elasticache-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/elasticache-helper.ts @@ -105,7 +105,7 @@ export function getCachePort( existingCache?: cache.CfnCacheCluster ): any { if (existingCache) { - return existingCache.attrConfigurationEndpointPort!; + return existingCache.attrConfigurationEndpointPort; } else if (clientCacheProps?.port) { return clientCacheProps.port; } else { diff --git a/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-defaults.ts index aba901cc4..750adc94a 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-defaults.ts @@ -56,6 +56,9 @@ export function DefaultCfnDomainProps(domainName: string, cognitoKibanaConfigure userPoolId: props.userpool.userPoolId, roleArn: cognitoKibanaConfigureRole.roleArn }, + domainEndpointOptions: { + tlsSecurityPolicy: elasticsearch.TLSSecurityPolicy.TLS_1_2, + }, accessPolicies: new iam.PolicyDocument({ statements: [ new iam.PolicyStatement({ diff --git a/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts index 932d4a0b0..f47e31c38 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts @@ -28,56 +28,60 @@ export interface CreateFargateServiceResponse { readonly containerDefinition: ecs.ContainerDefinition } +export interface CreateFargateServiceProps { + readonly constructVpc: ec2.IVpc, + readonly clientClusterProps?: ecs.ClusterProps, + readonly ecrRepositoryArn?: string, + readonly ecrImageVersion?: string, + readonly clientFargateTaskDefinitionProps?: ecs.FargateTaskDefinitionProps | any, + readonly clientContainerDefinitionProps?: ecs.ContainerDefinitionProps | any, + readonly clientFargateServiceProps?: ecs.FargateServiceProps | any +} + /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ export function CreateFargateService( scope: Construct, id: string, - constructVpc: ec2.IVpc, - clientClusterProps?: ecs.ClusterProps, - ecrRepositoryArn?: string, - ecrImageVersion?: string, - clientFargateTaskDefinitionProps?: ecs.FargateTaskDefinitionProps | any, - clientContainerDefinitionProps?: ecs.ContainerDefinitionProps | any, - clientFargateServiceProps?: ecs.FargateServiceProps | any + props: CreateFargateServiceProps ): CreateFargateServiceResponse { defaults.AddAwsServiceEndpoint( scope, - constructVpc, + props.constructVpc, defaults.ServiceEndpointTypes.ECR_API ); defaults.AddAwsServiceEndpoint( scope, - constructVpc, + props.constructVpc, defaults.ServiceEndpointTypes.ECR_DKR ); defaults.AddAwsServiceEndpoint( scope, - constructVpc, + props.constructVpc, defaults.ServiceEndpointTypes.S3 ); const constructContainerDefintionProps: any = {}; const constructFargateServiceDefinitionProps: any = {}; - if (!clientFargateServiceProps?.cluster) { + if (!props.clientFargateServiceProps?.cluster) { // Construct Fargate Service constructFargateServiceDefinitionProps.cluster = CreateCluster( scope, `${id}-cluster`, - constructVpc, - clientClusterProps + props.constructVpc, + props.clientClusterProps ); } // Set up the Fargate service - if (!clientContainerDefinitionProps?.image) { + if (!props.clientContainerDefinitionProps?.image) { constructContainerDefintionProps.image = CreateImage( scope, id, - ecrRepositoryArn, - ecrImageVersion + props.ecrRepositoryArn, + props.ecrImageVersion ); } @@ -86,32 +90,32 @@ export function CreateFargateService( const createTaskDefinitionResponse = CreateTaskDefinition( scope, id, - clientFargateTaskDefinitionProps, - clientContainerDefinitionProps, + props.clientFargateTaskDefinitionProps, + props.clientContainerDefinitionProps, constructContainerDefintionProps ); constructFargateServiceDefinitionProps.taskDefinition = createTaskDefinitionResponse.taskDefinition; newContainerDefinition = createTaskDefinitionResponse.containerDefinition; - if (!clientFargateServiceProps?.vpcSubnets) { - if (constructVpc.isolatedSubnets.length) { + if (!props.clientFargateServiceProps?.vpcSubnets) { + if (props.constructVpc.isolatedSubnets.length) { constructFargateServiceDefinitionProps.vpcSubnets = { - subnets: constructVpc.isolatedSubnets, + subnets: props.constructVpc.isolatedSubnets, }; } else { constructFargateServiceDefinitionProps.vpcSubnets = { - subnets: constructVpc.privateSubnets, + subnets: props.constructVpc.privateSubnets, }; } } let defaultFargateServiceProps; - if (!clientFargateServiceProps?.securityGroups) { + if (!props.clientFargateServiceProps?.securityGroups) { const serviceSecurityGroup = new ec2.SecurityGroup(scope, `${id}-sg`, { allowAllOutbound: true, disableInlineRules: false, - vpc: constructVpc, + vpc: props.constructVpc, // We add a description here so that this SG can be easily identified in tests description: 'Construct created security group' }); @@ -132,7 +136,7 @@ export function CreateFargateService( const fargateServiceProps = defaults.consolidateProps( defaultFargateServiceProps, - clientFargateServiceProps, + props.clientFargateServiceProps, constructFargateServiceDefinitionProps ); diff --git a/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts index 5a6acd091..104cf6e71 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts @@ -116,7 +116,7 @@ export function buildGlueJob(scope: Construct, props: BuildGlueJobProps): BuildG } const deployGlueJobResponse = - deployGlueJob(scope, props.glueJobProps, props.database!, props.table!, props.outputDataStore!, props.etlCodeAsset); + deployGlueJob(scope, props.glueJobProps, props.database, props.table, props.outputDataStore!, props.etlCodeAsset); return { job: deployGlueJobResponse.job, role: deployGlueJobResponse.role, @@ -149,7 +149,7 @@ export function deployGlueJob(scope: Construct, glueJobProps: glue.CfnJobProps, glueSecurityConfigName = 'ETLJobSecurityConfig'; const glueKMSKey = `arn:${Aws.PARTITION}:kms:${Aws.REGION}:${Aws.ACCOUNT_ID}:alias/aws/glue`; - new glue.CfnSecurityConfiguration(scope, 'GlueSecurityConfig', { + const securityConfigurationProps: glue.CfnSecurityConfigurationProps = { name: glueSecurityConfigName, encryptionConfiguration: { jobBookmarksEncryption: { @@ -160,7 +160,11 @@ export function deployGlueJob(scope: Construct, glueJobProps: glue.CfnJobProps, s3EncryptionMode: 'SSE-S3' }] } - }); + }; + + // Before turning off SonarQube for the line, reduce the line to it's minimum + new glue.CfnSecurityConfiguration(scope, 'GlueSecurityConfig', securityConfigurationProps); // NOSONAR + } else { glueSecurityConfigName = glueJobProps.securityConfiguration; } @@ -204,7 +208,7 @@ export function deployGlueJob(scope: Construct, glueJobProps: glue.CfnJobProps, ...glueJobProps.defaultArguments }; - const newGlueJobProps: glue.CfnJobProps = overrideProps(defaults.DefaultGlueJobProps(jobRole!, glueJobProps, + const newGlueJobProps: glue.CfnJobProps = overrideProps(defaults.DefaultGlueJobProps(jobRole, glueJobProps, glueSecurityConfigName, jobArgumentsList, etlCodeAsset), glueJobProps); if (etlCodeAsset) { etlCodeAsset.grantRead(jobRole); @@ -216,7 +220,7 @@ export function deployGlueJob(scope: Construct, glueJobProps: glue.CfnJobProps, } const scriptLocation = newGlueJobProps.command.scriptLocation; - const scriptBucketLocation: IBucket = Bucket.fromBucketArn(scope, 'ScriptLocaiton', getS3ArnfromS3Url(scriptLocation!)); + const scriptBucketLocation: IBucket = Bucket.fromBucketArn(scope, 'ScriptLocaiton', getS3ArnfromS3Url(scriptLocation)); scriptBucketLocation.grantRead(jobRole); } } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts index d2711c992..e54e7d9b0 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts @@ -146,8 +146,8 @@ export function CheckProps(propsObject: VerifiedProps | any) { const deployDeadLetterQueue: boolean = propsObject.deployDeadLetterQueue || propsObject.deployDeadLetterQueue === undefined; if (deployDeadLetterQueue && (isQueueFifo !== isDeadLetterQueueFifo)) { - errorMessages += 'Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: true in the other props object. \ - Fifo must match for the Queue and the Dead Letter Queue.\n'; + errorMessages += 'Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'; errorFound = true; } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts index 88214dc57..2aa22e631 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts @@ -24,8 +24,7 @@ import * as cdk from 'aws-cdk-lib'; import { overrideProps, addCfnSuppressRules } from './utils'; import { buildSecurityGroup } from "./security-group-helper"; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate -import { Construct } from 'constructs'; -import { IConstruct } from 'constructs'; +import { Construct, IConstruct } from 'constructs'; export interface BuildLambdaFunctionProps { /** @@ -65,7 +64,7 @@ export function buildLambdaFunction(scope: Construct, props: BuildLambdaFunction if (props.lambdaFunctionProps?.securityGroups) { let ctr = 20; props.lambdaFunctionProps?.securityGroups.forEach(sg => { - // TODO: Discuss with someone why I can't get R/O access to VpcConfigSecurityGroupIds + // It appears we can't get R/O access to VpcConfigSecurityGroupIds, such access would make this cleaner levelOneFunction.addOverride(`Properties.VpcConfig.SecurityGroupIds.${ctr++}`, sg.securityGroupId); }); } @@ -152,9 +151,7 @@ export function deployLambdaFunction(scope: Construct, const lambdafunction = new lambda.Function(scope, _functionId, finalLambdaFunctionProps); - if (lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_16_X || - lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_16_X || - lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_16_X) { + if (lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_16_X) { lambdafunction.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true }); } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/opensearch-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/opensearch-defaults.ts index 55742820d..827afd8bb 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/opensearch-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/opensearch-defaults.ts @@ -59,6 +59,9 @@ export function DefaultOpenSearchCfnDomainProps(domainName: string, cognitoConfi userPoolId: props.userpool.userPoolId, roleArn: cognitoConfigureRole.roleArn }, + domainEndpointOptions: { + tlsSecurityPolicy: opensearch.TLSSecurityPolicy.TLS_1_2, + }, accessPolicies: new iam.PolicyDocument({ statements: [ new iam.PolicyStatement({ diff --git a/source/patterns/@aws-solutions-constructs/core/lib/override-warning-service.ts b/source/patterns/@aws-solutions-constructs/core/lib/override-warning-service.ts index 635a049d1..fabfd7578 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/override-warning-service.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/override-warning-service.ts @@ -83,7 +83,7 @@ function findOverrides(defaultProps: object, userProps: object) { function formatOverridePath(path: string | string[]) { return (path !== undefined && path.length > 1) ? path.toString() .replace(/,/g, '][') - .replace(/\]{1}/, '') + .replace(/\]/, '') .replace(/$/, ']') : path; } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/utils.ts b/source/patterns/@aws-solutions-constructs/core/lib/utils.ts index 6789d9cbb..f0a831993 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/utils.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/utils.ts @@ -58,15 +58,6 @@ function isPlainObject(o: object) { return true; } -function combineMerge(target: any[], source: any[]) { - return target.concat(source); -} - -function overwriteMerge(target: any[], source: any[]) { - target = source; - return target; -} - /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ @@ -79,12 +70,12 @@ export function overrideProps(DefaultProps: object, userProps: object, concatArr // Override the sensible defaults with user provided props if (concatArray) { return deepmerge(DefaultProps, userProps, { - arrayMerge: combineMerge, + arrayMerge: (destinationArray, sourceArray) => destinationArray.concat(sourceArray), isMergeableObject: isPlainObject }); } else { return deepmerge(DefaultProps, userProps, { - arrayMerge: overwriteMerge, + arrayMerge: (_destinationArray, sourceArray) => sourceArray, // underscore allows arg to be ignored isMergeableObject: isPlainObject }); } diff --git a/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts index fc9473348..cec06de2c 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts @@ -32,7 +32,11 @@ test('Test ObtainAlb with existing ALB', () => { loadBalancerName: 'unique-name' }); - defaults.ObtainAlb(stack, 'test', vpc, true, existingLoadBalancer); + defaults.ObtainAlb(stack, 'test', { + vpc, + publicApi: true, + existingLoadBalancerObj: existingLoadBalancer + }); const template = Template.fromStack(stack); @@ -50,10 +54,14 @@ test('Test ObtainAlb for new ALB with provided props', () => { defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), }); - defaults.ObtainAlb(stack, 'test', vpc, true, undefined, { - loadBalancerName: 'new-loadbalancer', + defaults.ObtainAlb(stack, 'test', { vpc, - internetFacing: true + publicApi: true, + loadBalancerProps: { + loadBalancerName: 'new-loadbalancer', + vpc, + internetFacing: true + } }); const template = Template.fromStack(stack); @@ -73,7 +81,10 @@ test('Test ObtainAlb for new ALB with default props', () => { defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), }); - defaults.ObtainAlb(stack, 'test', vpc, false); + defaults.ObtainAlb(stack, 'test', { + vpc, + publicApi: false + }); const template = Template.fromStack(stack); @@ -95,7 +106,14 @@ test('Test with custom logging bucket props', () => { const testName = 'test-name'; - defaults.ObtainAlb(stack, 'test', vpc, false, undefined, undefined, true, { bucketName: testName }); + defaults.ObtainAlb(stack, 'test', { + vpc, + publicApi: false, + logAccessLogs: true, + loggingBucketProps: { + bucketName: testName + } + }); const template = Template.fromStack(stack); @@ -111,7 +129,11 @@ test('Test with no logging', () => { defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), }); - defaults.ObtainAlb(stack, 'test', vpc, false, undefined, undefined, false); + defaults.ObtainAlb(stack, 'test', { + vpc, + publicApi: false, + logAccessLogs: false + }); const template = Template.fromStack(stack); @@ -558,12 +580,12 @@ function CreateTestFunction(stack: Stack, id: string): lambda.Function { } function CreateTestFargateService(stack: Stack, id: string, vpc: ec2.IVpc): ecs.FargateService { - const createFargateServiceResponse = defaults.CreateFargateService(stack, - `${id}-fg-svc`, - vpc, - undefined, - 'arn:aws:ecr:us-east-1:123456789012:repository/fake-repo', - 'latest'); + const createFargateServiceResponse = defaults.CreateFargateService(stack, `${id}-fg-svc`, { + constructVpc: vpc, + clientClusterProps: undefined, + ecrRepositoryArn: 'arn:aws:ecr:us-east-1:123456789012:repository/fake-repo', + ecrImageVersion: 'latest' + }); return createFargateServiceResponse.service; } diff --git a/source/patterns/@aws-solutions-constructs/core/test/elasticsearch-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/elasticsearch-helper.test.ts index a9b238ced..12807e702 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/elasticsearch-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/elasticsearch-helper.test.ts @@ -122,6 +122,9 @@ test('Test override SnapshotOptions for buildElasticSearch', () => { Ref: "CognitoUserPool53E37E69" } }, + DomainEndpointOptions: { + TLSSecurityPolicy: elasticsearch.TLSSecurityPolicy.TLS_1_2, + }, DomainName: "test-domain", EBSOptions: { EBSEnabled: true, diff --git a/source/patterns/@aws-solutions-constructs/core/test/fargate-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/fargate-helper.test.ts index da623d247..0bbe984cc 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/fargate-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/fargate-helper.test.ts @@ -24,11 +24,10 @@ test('Test with all defaults', () => { const stack = new Stack(); const testVpc = defaults.getTestVpc(stack); - const createFargateServiceResponse = CreateFargateService(stack, - 'test', - testVpc, - undefined, - defaults.fakeEcrRepoArn); + const createFargateServiceResponse = CreateFargateService(stack, 'test', { + constructVpc: testVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn + }); expect(createFargateServiceResponse.containerDefinition).toBeDefined(); expect(createFargateServiceResponse.service).toBeDefined(); @@ -107,11 +106,10 @@ test('Test with all defaults in isolated VPC', () => { const stack = new Stack(); const testVpc = CreateIsolatedTestVpc(stack); - CreateFargateService(stack, - 'test', - testVpc, - undefined, - defaults.fakeEcrRepoArn); + CreateFargateService(stack, 'test', { + constructVpc: testVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn + }); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::ECS::Service", { @@ -184,17 +182,12 @@ test('Test with custom task definition', () => { const stack = new Stack(); const testVpc = CreateIsolatedTestVpc(stack); - CreateFargateService(stack, - 'test', - testVpc, - undefined, - undefined, - undefined, - undefined, - { + CreateFargateService(stack, 'test', { + constructVpc: testVpc, + clientContainerDefinitionProps: { image: CreateImage(stack) } - ); + }); Template.fromStack(stack).hasResourceProperties("AWS::ECS::TaskDefinition", { ContainerDefinitions: [ @@ -220,14 +213,14 @@ test('Test with custom container definition', () => { const stack = new Stack(); const testVpc = CreateIsolatedTestVpc(stack); - CreateFargateService(stack, - 'test', - testVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - { cpu: 256, memoryLimitMiB: 512 } - ); + CreateFargateService(stack, 'test', { + constructVpc: testVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateTaskDefinitionProps: { + cpu: 256, + memoryLimitMiB: 512 + } + }); Template.fromStack(stack).hasResourceProperties("AWS::ECS::TaskDefinition", { Cpu: '256', @@ -240,13 +233,13 @@ test('Test with custom cluster props', () => { const clusterName = 'test-value'; const testVpc = CreateIsolatedTestVpc(stack); - CreateFargateService(stack, - 'test', - testVpc, - { clusterName }, - defaults.fakeEcrRepoArn, - undefined, - ); + CreateFargateService(stack, 'test', { + constructVpc: testVpc, + clientClusterProps: { + clusterName + }, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + }); Template.fromStack(stack).hasResourceProperties("AWS::ECS::Cluster", { ClusterName: clusterName, @@ -258,16 +251,13 @@ test('Test with custom Fargate Service props', () => { const serviceName = 'test-value'; const testVpc = CreateIsolatedTestVpc(stack); - CreateFargateService(stack, - 'test', - testVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { serviceName } - ); + CreateFargateService(stack, 'test', { + constructVpc: testVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); Template.fromStack(stack).hasResourceProperties("AWS::ECS::Service", { ServiceName: serviceName, @@ -287,16 +277,11 @@ test('Test with custom security group', () => { description: groupDescription }); - CreateFargateService(stack, - 'test', - testVpc, - undefined, - defaults.fakeEcrRepoArn, - undefined, - undefined, - undefined, - { securityGroups: [ customSg ] } - ); + CreateFargateService(stack, 'test', { + constructVpc: testVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { securityGroups: [ customSg ] } + }); Template.fromStack(stack).hasResourceProperties("AWS::EC2::SecurityGroup", { GroupDescription: groupDescription, @@ -312,9 +297,9 @@ test('Test no image repo or image is an error', () => { const testVpc = CreateIsolatedTestVpc(stack); const app = () => { - CreateFargateService(stack, - 'test', - testVpc); + CreateFargateService(stack, 'test', { + constructVpc: testVpc + }); }; expect(app).toThrowError( diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts index a02eb4d33..fb991db03 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts @@ -157,8 +157,8 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to true and und }; // Assertion - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: true in the other props object. \ - Fifo must match for the Queue and the Dead Letter Queue.\n'); + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); }); test('Test fail Dead Letter Queue check with queueProps fifo set to true and deadLetterQueueProps fifo set to false', () => { @@ -173,8 +173,8 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to true and dea }; // Assertion - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: true in the other props object. \ - Fifo must match for the Queue and the Dead Letter Queue.\n'); + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); }); test('Test fail Dead Letter Queue check with queueProps fifo set to false and deadLetterQueueProps fifo set to true', () => { @@ -189,8 +189,8 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to false and de }; // Assertion - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: true in the other props object. \ - Fifo must match for the Queue and the Dead Letter Queue.\n'); + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); }); test('Test fail Dead Letter Queue check with deadLetterQueueProps fifo set to true', () => { @@ -203,8 +203,8 @@ test('Test fail Dead Letter Queue check with deadLetterQueueProps fifo set to tr defaults.CheckProps(props); }; - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: true in the other props object. \ - Fifo must match for the Queue and the Dead Letter Queue.\n'); + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); }); test('Test fail Dead Letter Queue check with queueProps fifo set to false', () => { @@ -217,8 +217,8 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to false', () = defaults.CheckProps(props); }; - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: true in the other props object. \ - Fifo must match for the Queue and the Dead Letter Queue.\n'); + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); }); test("Test fail MediaStore container check", () => { diff --git a/source/patterns/@aws-solutions-constructs/core/test/opensearch-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/opensearch-helper.test.ts index 632dd4c92..6959280ac 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/opensearch-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/opensearch-helper.test.ts @@ -114,6 +114,9 @@ test('Test override SnapshotOptions for buildOpenSearch', () => { Ref: "CognitoUserPool53E37E69" } }, + DomainEndpointOptions: { + TLSSecurityPolicy: opensearch.TLSSecurityPolicy.TLS_1_2, + }, DomainName: "test-domain", EBSOptions: { EBSEnabled: true, From 30ba7d94a3cdd3766c24af49dbf66e56053b7b41 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Thu, 4 May 2023 10:34:07 -0400 Subject: [PATCH 17/73] fix(aws-alb-fargate): change container used to launch integ tests (#962) * Change Docker Containter used for test * Delete commented code, add comments re: container * More cuts --- .../integ.all-existing-private-http.expected.json | 6 +++--- .../test/integ.all-existing-private-http.ts | 3 ++- .../test/integ.all-new-public-http.expected.json | 8 ++++---- .../test/integ.all-new-public-http.ts | 3 ++- .../test/integ.all-new-two-targets.expected.json | 12 ++++++------ .../test/integ.all-new-two-targets.ts | 3 ++- 6 files changed, 19 insertions(+), 16 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json index 35a33e4f7..f552779d8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json @@ -651,7 +651,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -667,7 +666,8 @@ "Key": "Name", "Value": "all-existing-private-http/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { @@ -913,7 +913,7 @@ "ContainerDefinitions": [ { "Essential": true, - "Image": "nginx", + "Image": "public.ecr.aws/m7z7i5e4/integration-test-image:latest", "MemoryReservation": 512, "Name": "test-container", "PortMappings": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts index 8d616b24e..bc41e907b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts @@ -26,7 +26,8 @@ const stack = new Stack(app, defaults.generateIntegStackName(__filename), { }); stack.templateOptions.description = 'Integration Test for private HTTPS API with existing VPC, LoadBalancer and Service'; -const image = ecs.ContainerImage.fromRegistry('nginx'); +// This is a minimal web server in our account that passes health checks +const image = ecs.ContainerImage.fromRegistry('public.ecr.aws/m7z7i5e4/integration-test-image:latest'); const testExistingVpc = defaults.getTestVpc(stack); diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json index 65ee903b0..0762d40a2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json @@ -682,7 +682,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -698,7 +697,8 @@ "Key": "Name", "Value": "all-new-public-http/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { @@ -1186,7 +1186,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1375,7 +1375,7 @@ "ContainerDefinitions": [ { "Essential": true, - "Image": "nginx", + "Image": "public.ecr.aws/m7z7i5e4/integration-test-image:latest", "MemoryReservation": 512, "Name": "test-construct-container", "PortMappings": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.ts index 3c7a39da8..4b6cf9705 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.ts @@ -26,7 +26,8 @@ const stack = new Stack(app, generateIntegStackName(__filename), { }); stack.templateOptions.description = 'Integration Test for public HTTP API with new VPC, LoadBalancer and Service'; -const image = ecs.ContainerImage.fromRegistry('nginx'); +// This is a minimal web server in our account that passes health checks +const image = ecs.ContainerImage.fromRegistry('public.ecr.aws/m7z7i5e4/integration-test-image:latest'); const testProps: AlbToFargateProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json index 001a04dfe..eccb6f6e7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json @@ -53,10 +53,10 @@ } } ], + "Priority": 10, "ListenerArn": { "Ref": "testconstructtestconstructlistener484444F1" - }, - "Priority": 10 + } } }, "Vpc8378EB38": { @@ -709,7 +709,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -725,7 +724,8 @@ "Key": "Name", "Value": "all-new-two-targets/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { @@ -1213,7 +1213,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1402,7 +1402,7 @@ "ContainerDefinitions": [ { "Essential": true, - "Image": "nginx", + "Image": "public.ecr.aws/m7z7i5e4/integration-test-image:latest", "MemoryReservation": 512, "Name": "test-construct-container", "PortMappings": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.ts index ce4730832..9c6591758 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.ts @@ -26,7 +26,8 @@ const stack = new Stack(app, defaults.generateIntegStackName(__filename), { }); stack.templateOptions.description = 'Integration Test for public HTTP API with new VPC, LoadBalancer and Service and 2 targets'; -const image = ecs.ContainerImage.fromRegistry('nginx'); +// This is a minimal web server in our account that passes health checks +const image = ecs.ContainerImage.fromRegistry('public.ecr.aws/m7z7i5e4/integration-test-image:latest'); const testProps: AlbToFargateProps = { publicApi: true, From eae0b05bc301d7cfd4ae42697496491e3a422108 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Wed, 10 May 2023 12:36:23 -0400 Subject: [PATCH 18/73] Update README.md (#963) --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 67d650ced..a634edd8a 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,9 @@ The AWS Solutions Constructs library is an open-source extension of the AWS Clou The patterns defined in AWS Solutions Constructs are high level, multi-service abstractions of AWS CDK constructs that have default configurations based on well-architected best practices. The library is organized into logical modules using object-oriented techniques to create each architectural pattern model. -The CDK is available in the following languages: +## CDK Versions -* JavaScript, TypeScript (Node.js ≥ 10.13.0) -* Python (Python ≥ 3.6) -* Java (Java ≥ 8 and Maven ≥ 3.5.4) +AWS Solutions Constructs and the AWS CDK are independent teams and have different release schedules. Each release of AWS Solutions Constructs is built against a specific version of the AWS CDK. The CHANGELOG.md file lists the CDK version associated with each AWS Solutions Constructs release. For instance, AWS Solutions Constructs v2.39.0 was built against AWS CDK v2.76.0. This means that to use AWS Solutions Constructs v2.39.0, your application must include AWS CDK v2.76.0 *or later*. You can continue to use the latest AWS CDK versions and upgrade the your AWS Solutions Constructs version when new releases become available. ## Modules From 8ca5242530716c6401a3749ad2187f266e26cf4d Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Thu, 11 May 2023 08:33:56 -0400 Subject: [PATCH 19/73] Address SonarQube issues (#964) --- refresh-multiple-tests.sh | 43 +++++++++ .../test/integ.deploy-with-vpc.expected.json | 1 + .../test/integ.no-arguments.expected.json | 1 + .../integ.existing-resources.expected.json | 1 + .../test/integ.new-resources.expected.json | 1 + ...loyFunctionWithClusterConfig.expected.json | 1 + ...eployFunctionWithExistingVpc.expected.json | 1 + ...g.deployFunctionWithVpcProps.expected.json | 1 + .../integ.deployToFiveZones.expected.json | 1 + .../integ.disabledZoneAwareness.expected.json | 1 + .../test/integ.domain-arguments.expected.json | 1 + .../test/integ.no-arguments.expected.json | 1 + .../test/integ.cluster-config.expected.json | 1 + ...nteg.disabled-zone-awareness.expected.json | 1 + .../test/integ.domain-arguments.expected.json | 1 + .../test/integ.existing-vpc.expected.json | 1 + .../test/integ.no-arguments.expected.json | 1 + .../test/integ.vpc-props.expected.json | 1 + .../aws-route53-apigateway/lib/index.ts | 8 +- .../aws-s3-stepfunctions/lib/index.ts | 4 +- .../aws-wafwebacl-alb/lib/index.ts | 8 +- .../core/lib/alb-helper.ts | 4 +- .../core/lib/elasticsearch-defaults.ts | 3 +- .../core/lib/eventbridge-helper.ts | 3 +- .../core/lib/opensearch-defaults.ts | 3 +- .../core/lib/s3-bucket-defaults.ts | 13 --- .../core/lib/s3-bucket-helper.ts | 24 +++-- .../core/lib/sqs-helper.ts | 3 +- .../core/lib/vpc-helper.ts | 3 +- .../core/test/elasticsearch-helper.test.ts | 3 +- .../core/test/opensearch-helper.test.ts | 3 +- source/yarn-error.log | 89 +++++++++++++++++++ 32 files changed, 193 insertions(+), 38 deletions(-) create mode 100755 refresh-multiple-tests.sh create mode 100644 source/yarn-error.log diff --git a/refresh-multiple-tests.sh b/refresh-multiple-tests.sh new file mode 100755 index 000000000..663438e5a --- /dev/null +++ b/refresh-multiple-tests.sh @@ -0,0 +1,43 @@ +# How to use this script +# +# This script will refresh integration tests for multiple +# Solutions Constructs sequentially and unattended. If you're +# doing a release and have to update many integration tests, this is +# for you. + +# Open a docker build environment +# Run build-patterns.sh through at least the building of core, then you can ctrl-c +# List all the constructs whose integration tests you want to refresh in the +# export constructs list (you can delete the examples that are there) +# Run this script from the top level aws-solutions-constructs folder. +# +# Advanced use - if you have too many constructs to wait for, you can create +# another copy of this script to run concurrently with a different list of constructs +# 1) Remove the align-version.sh revert lines from this script and the copy +# 2) Remove source allow-partial-builds.sh line from the copy +# 3) Keep any dependencies together and in order +# (e.g. dynamodbstreams-lambda-elasticsearch must be built AFTER +# dynamodbstreams-lambda and lambda-elasticsearch) + +export constructs=" + aws-lambda-elasticsearch-kibana + aws-lambda-opensearch + aws-fargate-opensearch + aws-dynamodbstreams-lambda-elasticsearch-kibana +" + +# deployment_dir is top level aws-solutions-constructs +deployment_dir=$(cd $(dirname $0) && pwd) + +source ./deployment/v2/allow-partial-builds.sh +for construct in $constructs; do + + cd $deployment_dir/source/patterns/@aws-solutions-constructs/$construct + echo Running in $PWD + npm run jsii && npm run lint + cdk-integ + npm run build+lint+test + cd $deployment_dir/source/patterns/@aws-solutions-constructs +done +cd $deployment_dir +./deployment/v2/align-version.sh revert diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json index 39c58a87b..5eab067ed 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json @@ -625,6 +625,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "domaintest-7c94db", diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json index d5b6352f4..aee329669 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json @@ -555,6 +555,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "domaintest-7c94db", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json index d203de3c2..7fcf875da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json @@ -1373,6 +1373,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "solution-constructs", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json index 531d51cc1..d29d2ac1d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json @@ -351,6 +351,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "solution-constructs", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json index 93de4aae8..f2268c180 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json @@ -554,6 +554,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "deploytestwithclusterconfig", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json index 4c975e6fd..419ab19d7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json @@ -1228,6 +1228,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "deploytestwithexistingvpc", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json index 5e5a2f7bd..de038946d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json @@ -556,6 +556,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "deploytestwithvpcprops", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json index 1bb85d0fa..87be3185f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json @@ -558,6 +558,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "deploytestfivezones", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json index 13feed655..9adfc0a56 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json @@ -550,6 +550,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "disabledzoneawareness", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json index b751b62d9..a797b241a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json @@ -493,6 +493,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "domain-args-7c94", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json index 91a42c69d..0bc0190a8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json @@ -493,6 +493,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "domain-args-9e54", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json index 1a1ecc48b..f301d04d5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json @@ -563,6 +563,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "deploytestwithclusterconfig", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json index 1c7aa543e..6e7f1368a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json @@ -556,6 +556,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "disabledzoneawareness", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json index c19cf238e..a62047ffa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json @@ -502,6 +502,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "solutions-constructs-domain", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json index c8bf4c695..d15057b56 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json @@ -1237,6 +1237,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "deploytestwithexistingvpc", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json index 7cb5c31f5..92867fabe 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json @@ -502,6 +502,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "solutions-constructs-domain", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json index c1edf72a8..d19b26bde 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json @@ -565,6 +565,7 @@ } }, "DomainEndpointOptions": { + "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, "DomainName": "deploytestwithvpcprops", diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts index bc75ffd73..bb1c001e4 100755 --- a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts @@ -132,10 +132,12 @@ export class Route53ToApiGateway extends Construct { certificate: this.certificate }); - // Create A Record in custom domain to route traffic to API Gateway - new route53.ARecord(this, 'CustomDomainAliasRecord', { + const arecordProps: route53.ARecordProps = { zone: this.hostedZone, target: route53.RecordTarget.fromAlias(new targets.ApiGateway(this.apiGateway)) - }); + }; + + // Create A Record in custom domain to route traffic to API Gateway + new route53.ARecord(this, 'CustomDomainAliasRecord', arecordProps); // NOSONAR } } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts index 0ef8ec2fe..cfe47d63c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts @@ -111,8 +111,8 @@ export class S3ToStepfunctions extends Construct { let bucket: s3.IBucket; if (props.deployCloudTrail !== undefined) { - defaults.printWarning("The deployCloudTrail prop has been deprecated since this construct no longer requires \ - AWS CloudTrail to implement its functionality. This construct no longer creates a CloudTrail in your account."); + defaults.printWarning("The deployCloudTrail prop has been deprecated since this construct no longer requires " + + "AWS CloudTrail to implement its functionality. This construct no longer creates a CloudTrail in your account."); } if (!props.existingBucketObj) { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts index 47f51901b..55d74c8d1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts @@ -61,11 +61,13 @@ export class WafwebaclToAlb extends Construct { webaclProps: props.webaclProps, }); - // Setup the Web ACL Association - new waf.CfnWebACLAssociation(scope, `${id}-WebACLAssociation`, { + const aclProps: waf.CfnWebACLAssociationProps = { webAclArn: this.webacl.attrArn, resourceArn: props.existingLoadBalancerObj.loadBalancerArn - }); + }; + + // Setup the Web ACL Association + new waf.CfnWebACLAssociation(scope, `${id}-WebACLAssociation`, aclProps); this.loadBalancer = props.existingLoadBalancerObj; } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts index 05c245419..8441bd6b5 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts @@ -27,7 +27,7 @@ import * as elbt from "aws-cdk-lib/aws-elasticloadbalancingv2-targets"; import { printWarning, consolidateProps } from "./utils"; import { DefaultListenerProps } from "./alb-defaults"; import { createAlbLoggingBucket } from "./s3-bucket-helper"; -import { DefaultLoggingBucketProps } from "./s3-bucket-defaults"; +import { DefaultS3Props } from "./s3-bucket-defaults"; export interface ObtainAlbProps { readonly vpc: ec2.IVpc, @@ -61,7 +61,7 @@ export function ObtainAlb( consolidatedProps ); if (props.logAccessLogs === undefined || props.logAccessLogs === true) { - const consolidatedLoggingBucketProps = consolidateProps(DefaultLoggingBucketProps(), props.loggingBucketProps); + const consolidatedLoggingBucketProps = consolidateProps(DefaultS3Props(), props.loggingBucketProps); const loggingBucket = createAlbLoggingBucket(scope, id, consolidatedLoggingBucketProps); loadBalancer.logAccessLogs(loggingBucket); } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-defaults.ts index 750adc94a..25b5e56ad 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-defaults.ts @@ -57,7 +57,8 @@ export function DefaultCfnDomainProps(domainName: string, cognitoKibanaConfigure roleArn: cognitoKibanaConfigureRole.roleArn }, domainEndpointOptions: { - tlsSecurityPolicy: elasticsearch.TLSSecurityPolicy.TLS_1_2, + enforceHttps: true, + tlsSecurityPolicy: 'Policy-Min-TLS-1-2-2019-07', }, accessPolicies: new iam.PolicyDocument({ statements: [ diff --git a/source/patterns/@aws-solutions-constructs/core/lib/eventbridge-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/eventbridge-helper.ts index ea4a7b4f7..469ca514f 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/eventbridge-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/eventbridge-helper.ts @@ -47,5 +47,6 @@ export function buildEventBus(scope: Construct, props: BuildEventBusProps): even const _eventBusName = props.eventBusProps.eventBusName || 'CustomEventBus'; return new events.EventBus(scope, _eventBusName, props.eventBusProps); } - return; + // ESLint requires this return statement, so disabling SonarQube warning + return; // NOSONAR } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/lib/opensearch-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/opensearch-defaults.ts index 827afd8bb..9f3c62ac8 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/opensearch-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/opensearch-defaults.ts @@ -60,7 +60,8 @@ export function DefaultOpenSearchCfnDomainProps(domainName: string, cognitoConfi roleArn: cognitoConfigureRole.roleArn }, domainEndpointOptions: { - tlsSecurityPolicy: opensearch.TLSSecurityPolicy.TLS_1_2, + enforceHttps: true, + tlsSecurityPolicy: 'Policy-Min-TLS-1-2-2019-07', }, accessPolicies: new iam.PolicyDocument({ statements: [ diff --git a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-defaults.ts index 73f96a192..251eafcaa 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-defaults.ts @@ -35,18 +35,5 @@ export function DefaultS3Props(loggingBucket?: Bucket, lifecycleRules?: s3.Lifec } as BucketProps; } -/** - * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. - */ -export function DefaultLoggingBucketProps(): s3.BucketProps { - return { - encryption: s3.BucketEncryption.S3_MANAGED, - versioned: true, - blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, - removalPolicy: RemovalPolicy.RETAIN, - enforceSSL: true, - } as BucketProps; -} - // Default event types to trigger S3 notifications export const defaultS3NotificationEventTypes = [s3.EventType.OBJECT_CREATED]; \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts index 89b6dce02..3c6e09e30 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts @@ -21,7 +21,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as s3 from 'aws-cdk-lib/aws-s3'; import * as cdk from 'aws-cdk-lib'; import { DefaultS3Props } from './s3-bucket-defaults'; -import { overrideProps, addCfnSuppressRules } from './utils'; +import { overrideProps, addCfnSuppressRules, consolidateProps } from './utils'; import { StorageClass } from 'aws-cdk-lib/aws-s3'; import { Duration } from 'aws-cdk-lib'; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate @@ -56,8 +56,12 @@ export function createLoggingBucket(scope: Construct, bucketId: string, loggingBucketProps: s3.BucketProps): s3.Bucket { + // Introduce the default props since we can't be certain the caller used them and + // they are important best practices + const combinedBucketProps = consolidateProps(DefaultS3Props(), loggingBucketProps); + // Create the Logging Bucket - const loggingBucket: s3.Bucket = new s3.Bucket(scope, bucketId, loggingBucketProps); + const loggingBucket: s3.Bucket = new s3.Bucket(scope, bucketId, combinedBucketProps); // Extract the CfnBucket from the loggingBucket const loggingBucketResource = loggingBucket.node.findChild('Resource') as s3.CfnBucket; @@ -88,8 +92,12 @@ export function createAlbLoggingBucket(scope: Construct, bucketId: string, loggingBucketProps: s3.BucketProps): s3.Bucket { + // Introduce the default props since we can't be certain the caller used them and + // they are important best practices + const combinedBucketProps = consolidateProps(DefaultS3Props(), loggingBucketProps); + // Create the Logging Bucket - const loggingBucket: s3.Bucket = new s3.Bucket(scope, bucketId, loggingBucketProps); + const loggingBucket: s3.Bucket = new s3.Bucket(scope, bucketId, combinedBucketProps); // Extract the CfnBucket from the loggingBucket const loggingBucketResource = loggingBucket.node.findChild('Resource') as s3.CfnBucket; @@ -125,7 +133,7 @@ export function buildS3Bucket(scope: Construct, }]; // Create the Application Bucket - let customBucketProps: s3.BucketProps; + let defaultBucketProps: s3.BucketProps; let loggingBucket; const resolvedBucketId = bucketId ? bucketId + 'S3Bucket' : 'S3Bucket'; const loggingBucketId = bucketId ? bucketId + 'S3LoggingBucket' : 'S3LoggingBucket'; @@ -151,14 +159,14 @@ export function buildS3Bucket(scope: Construct, // Attach the Default Life Cycle policy ONLY IF the versioning is ENABLED if (props.bucketProps?.versioned === undefined || props.bucketProps.versioned) { - customBucketProps = DefaultS3Props(loggingBucket, lifecycleRules); + defaultBucketProps = DefaultS3Props(loggingBucket, lifecycleRules); } else { - customBucketProps = DefaultS3Props(loggingBucket); + defaultBucketProps = DefaultS3Props(loggingBucket); } - customBucketProps = props.bucketProps ? overrideProps(customBucketProps, props.bucketProps) : customBucketProps; + const combinedBucketProps = consolidateProps(defaultBucketProps, props.bucketProps); - const s3Bucket: s3.Bucket = new s3.Bucket(scope, resolvedBucketId, customBucketProps ); + const s3Bucket: s3.Bucket = new s3.Bucket(scope, resolvedBucketId, combinedBucketProps ); return { bucket: s3Bucket, loggingBucket }; } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts index 6966eea1a..bd49f1214 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts @@ -171,7 +171,8 @@ export function buildDeadLetterQueue(scope: Construct, props: BuildDeadLetterQue // Return the dead letter queue interface return dlqInterface; } - return; + // ESLint requires this return statement, so disabling SonarQube warning + return; // NOSONAR } function applySecureQueuePolicy(queue: sqs.Queue): void { diff --git a/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts index 3413a55fc..542dc9f1d 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts @@ -188,7 +188,8 @@ export function AddAwsServiceEndpoint( AddInterfaceEndpoint(scope, vpc, service, interfaceTag); } - return; + // ESLint requires this return statement, so disabling SonarQube warning + return; // NOSONAR } function CheckIfEndpointAlreadyExists(vpc: ec2.IVpc, interfaceTag: ServiceEndpointTypes): boolean { diff --git a/source/patterns/@aws-solutions-constructs/core/test/elasticsearch-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/elasticsearch-helper.test.ts index 12807e702..4bb0c5658 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/elasticsearch-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/elasticsearch-helper.test.ts @@ -123,7 +123,8 @@ test('Test override SnapshotOptions for buildElasticSearch', () => { } }, DomainEndpointOptions: { - TLSSecurityPolicy: elasticsearch.TLSSecurityPolicy.TLS_1_2, + EnforceHTTPS: true, + TLSSecurityPolicy: 'Policy-Min-TLS-1-2-2019-07', }, DomainName: "test-domain", EBSOptions: { diff --git a/source/patterns/@aws-solutions-constructs/core/test/opensearch-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/opensearch-helper.test.ts index 6959280ac..c086dce64 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/opensearch-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/opensearch-helper.test.ts @@ -115,7 +115,8 @@ test('Test override SnapshotOptions for buildOpenSearch', () => { } }, DomainEndpointOptions: { - TLSSecurityPolicy: opensearch.TLSSecurityPolicy.TLS_1_2, + EnforceHTTPS: true, + TLSSecurityPolicy: 'Policy-Min-TLS-1-2-2019-07', }, DomainName: "test-domain", EBSOptions: { diff --git a/source/yarn-error.log b/source/yarn-error.log new file mode 100644 index 000000000..40efb2f05 --- /dev/null +++ b/source/yarn-error.log @@ -0,0 +1,89 @@ +Arguments: + /usr/bin/node /usr/share/yarn/bin/yarn.js install --frozen-lockfile + +PATH: + /Users/biffgaut/Documents/Active/AWS/Constructs/github/CodeSmellsRoundTwo/aws-solutions-constructs/source/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/cargo/bin:/opt/golang/go/bin:/opt/apache/maven/bin + +Yarn version: + 1.22.19 + +Node version: + 16.19.1 + +Platform: + linux arm64 + +Trace: + Error: getaddrinfo EAI_AGAIN registry.yarnpkg.com + at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:109:26) + +npm manifest: + { + "name": "aws-solutions-constructs", + "version": "2.39.0", + "description": "AWS Solutions Constructs Library", + "repository": { + "type": "git", + "url": "https://github.com/awslabs/aws-solutions-constructs.git", + "directory": "source" + }, + "license": "Apache-2.0", + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com" + }, + "private": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^2.14.0", + "@typescript-eslint/parser": "^2.14.0", + "eslint": "^6.8.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-import-resolver-typescript": "^2.0.0", + "eslint-plugin-import": "^2.19.1", + "eslint-plugin-license-header": "^0.2.0", + "fs-extra": "^8.1.0", + "jest": "^27.4.0", + "jsii": "^1.49.0", + "jsii-pacmak": "^1.49.0", + "tslint": "^5.20.1", + "typescript": "4.7.4", + "aws-cdk-migration": "^1.135.0" + }, + "devDependencies": { + "lerna": "^3.22.1", + "aws-cdk-lib": "2.76.0", + "constructs": "^10.0.0" + }, + "workspaces": { + "packages": [ + "./patterns/@aws-solutions-constructs/*" + ], + "nohoist": [ + "**/deepmerge", + "**/deepmerge/**", + "**/npmlog", + "**/npmlog/**", + "**/@types/npmlog", + "**/@types/npmlog/**", + "**/deep-diff", + "**/deep-diff/**", + "**/@types/deep-diff", + "**/@types/deep-diff/**" + ] + }, + "resolutions": { + "@types/babel__traverse": "7.18.2", + "**/@typescript-eslint/eslint-plugin": "^4.1.1", + "**/@typescript-eslint/parser": "^4.1.1" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.76.0", + "constructs": "^10.0.0" + } + } + +yarn manifest: + No manifest + +Lockfile: + No lockfile From c973cd4268e431e3db462ef3287380611473348e Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Fri, 2 Jun 2023 15:03:14 -0400 Subject: [PATCH 20/73] chore(constructs): upgrade to cdk v2.81.0 (#967) * Use latest CDK in cdk-integ * Upgrade CDK to v2.81.0 * Update Viperlight Line Exemptions * Suppress cfn-nag rules for CDK AutoDelete Objects * Add cfn-nag suppressions to snapshots * eslint brush --- .viperlightignore | 28 +- deployment/v2/align-version.js | 2 +- refresh-multiple-tests.sh | 11 +- .../integ.all-new-public-http.expected.json | 11 +- .../integ.all-new-two-targets.expected.json | 11 +- ....privateApiExistingResources.expected.json | 11 +- ...integ.privateApiNewResources.expected.json | 11 +- ...g.publicApiExistingResources.expected.json | 11 +- .../integ.publicApiNewResources.expected.json | 11 +- .../test/integ.twoTargets.expected.json | 11 +- ...ustomCloudfrontLoggingBucket.expected.json | 107 +- .../test/integ.no-arguments.expected.json | 107 +- .../integ.override-behavior.expected.json | 107 +- ...ustomCloudfrontLoggingBucket.expected.json | 107 +- .../test/integ.no-arguments.expected.json | 107 +- ...ustomCloudFrontLoggingBucket.expected.json | 107 +- .../test/integ.default.expected.json | 107 +- .../integ.existingContainer.expected.json | 107 +- .../integ.overrideProperties.expected.json | 107 +- ...g.withoutHttpSecurityHeaders.expected.json | 107 +- .../integ.custom-originPath.expected.json | 107 +- ...nteg.custom-security-headers.expected.json | 107 +- ...ustomCloudFrontLoggingBucket.expected.json | 107 +- .../integ.customLoggingBucket.expected.json | 107 +- .../test/integ.existing-bucket.expected.json | 133 ++- .../test/integ.existing-bucket.ts | 1 + .../test/integ.no-arguments.expected.json | 107 +- .../integ.no-security-headers.expected.json | 107 +- ...integ.existingFargateService.expected.json | 107 +- .../test/integ.existingVpc.expected.json | 107 +- ...nteg.fargateServiceFromProps.expected.json | 107 +- .../test/integ.noArguments.expected.json | 2 +- .../test/integ.vpcFromprops.expected.json | 107 +- .../integ.existing-resources.expected.json | 40 +- .../test/integ.existing-resources.ts | 1 + .../test/integ.new-resources.expected.json | 4 +- ...integ.iot-s3-existing-bucket.expected.json | 271 ++++- .../test/integ.iot-s3-existing-bucket.ts | 18 +- .../integ.pre-existing-bucket.expected.json | 263 ++++- .../test/integ.pre-existing-bucket.ts | 4 +- ....pre-existing-logging-bucket.expected.json | 359 ++++++- .../test/integ.pre-existing-logging-bucket.ts | 10 +- .../test/integ.existing-bucket.expected.json | 263 ++++- .../test/integ.existing-bucket.ts | 4 +- ...nteg.existing-logging-bucket.expected.json | 260 ++++- .../test/integ.existing-logging-bucket.ts | 5 +- .../integ.existing-function.expected.json | 107 +- .../test/integ.existing-vpc.expected.json | 107 +- .../test/integ.new-vpc.expected.json | 107 +- .../test/integ.no-arguments.expected.json | 107 +- .../integ.pre-existing-bucket.expected.json | 263 ++++- .../test/integ.pre-existing-bucket.ts | 5 +- .../aws-lambda-s3/test/lambda-s3.test.ts | 2 +- .../test/integ.deployPrivateApi.expected.json | 11 +- ...deployPrivateApiExistingZone.expected.json | 11 +- .../integ.deployPublicApiNewAlb.expected.json | 11 +- .../integ.existing-s3-bucket.expected.json | 267 ++++- .../test/integ.existing-s3-bucket.ts | 5 +- .../test/integ.existingS3Bucket.expected.json | 263 ++++- .../aws-s3-sns/test/integ.existingS3Bucket.ts | 4 +- .../integ.existingLoggingBucket.expected.json | 924 ++++++++++++++++++ .../test/integ.existingLoggingBucket.ts | 39 + .../test/integ.existingS3Bucket.expected.json | 333 +++++-- .../aws-s3-sqs/test/integ.existingS3Bucket.ts | 9 +- .../integ.pre-existing-bucket.expected.json | 261 ++++- .../test/integ.pre-existing-bucket.ts | 10 +- .../core/test/test-helper.ts | 6 +- source/tools/cdk-integ-tools/package.json | 10 +- .../test/integ.gluejob.expected.json | 1 - .../test/integ.basic-deployment.expected.json | 1 - .../test/integ.basic-deployment.expected.json | 1 - 71 files changed, 6345 insertions(+), 416 deletions(-) create mode 100644 source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.ts diff --git a/.viperlightignore b/.viperlightignore index e41b9a0be..d07f9c791 100644 --- a/.viperlightignore +++ b/.viperlightignore @@ -145,26 +145,18 @@ source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md:35 source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts:27 source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts:680 # These are references to the us-east-1 ELBV2 account (publicly known) -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json:196 -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json:911 -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json:240 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json:199 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json:202 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json:202 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json:1067 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json:1067 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json:235 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json:904 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json:233 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json:238 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json:244 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json:244 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json:1132 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json:1132 source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json:1034 -source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json:1007 -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json:242 -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json:899 +source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json:1062 source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json:237 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json:245 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json:251 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json:251 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json:1139 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json:1139 -source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json:1096 -source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json:1069 +source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json:1089 source/patterns/@aws-solutions-constructs/aws-alb-fargate/README.md:79 source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md:85 source/patterns/@aws-solutions-constructs/aws-route53-alb/README.md:60 diff --git a/deployment/v2/align-version.js b/deployment/v2/align-version.js index 4550e8a5c..99068f430 100755 --- a/deployment/v2/align-version.js +++ b/deployment/v2/align-version.js @@ -10,7 +10,7 @@ const findVersion = process.argv[2]; const replaceVersion = process.argv[3]; // these versions need to be sourced from a config file -const awsCdkLibVersion = '2.76.0'; +const awsCdkLibVersion = '2.81.0'; const constructsVersion = '10.0.0'; const MODULE_EXEMPTIONS = new Set([ '@aws-cdk/cloudformation-diff', diff --git a/refresh-multiple-tests.sh b/refresh-multiple-tests.sh index 663438e5a..2ff5aa022 100755 --- a/refresh-multiple-tests.sh +++ b/refresh-multiple-tests.sh @@ -20,10 +20,13 @@ # dynamodbstreams-lambda and lambda-elasticsearch) export constructs=" - aws-lambda-elasticsearch-kibana - aws-lambda-opensearch - aws-fargate-opensearch - aws-dynamodbstreams-lambda-elasticsearch-kibana + aws-s3-lambda + aws-s3-sns + aws-s3-sqs + aws-s3-stepfunctions + aws-lambda-s3 + aws-fargate-s3 + aws-cloudfront-s3 " # deployment_dir is top level aws-solutions-constructs diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json index 0762d40a2..8140221e1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json @@ -1048,14 +1048,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -1197,7 +1190,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json index eccb6f6e7..49d5ae829 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json @@ -1075,14 +1075,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -1224,7 +1217,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json index c875911da..a464cff7e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json @@ -1118,14 +1118,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -1267,7 +1260,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json index 99f490039..26e533c99 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json @@ -224,14 +224,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -922,7 +915,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json index fb4370078..f8efc14d1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json @@ -1118,14 +1118,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -1267,7 +1260,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json index 9ffa833a3..c01076512 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json @@ -230,14 +230,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -1325,7 +1318,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json index 0b975d879..fcf04b74a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json @@ -230,14 +230,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -1352,7 +1345,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json index cc66b6fb3..d5ef6110f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json @@ -891,7 +891,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -902,7 +902,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -967,6 +967,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json index 1e8754d26..634d54238 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json @@ -891,7 +891,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -902,7 +902,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -967,6 +967,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json index d792ff6e5..c67b521d0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json @@ -930,7 +930,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -941,7 +941,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -1006,6 +1006,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json index 22fa397c5..2f08d62ff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json @@ -891,7 +891,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -902,7 +902,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -967,6 +967,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json index 38ad05408..4f4e17671 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json @@ -891,7 +891,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -902,7 +902,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -967,6 +967,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json index 76033030b..76821d838 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json @@ -417,7 +417,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -428,7 +428,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -465,6 +465,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json index 530f6f340..ac97c2c9b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json @@ -417,7 +417,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -428,7 +428,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -465,6 +465,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json index ecb3e9647..e1188e25c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json @@ -334,7 +334,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -345,7 +345,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -382,6 +382,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json index cc400e87a..9765898cd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json @@ -376,7 +376,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -387,7 +387,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -424,6 +424,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json index 9c651e913..f78e1bcf4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json @@ -394,7 +394,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -405,7 +405,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -442,6 +442,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json index 9520bb929..d3ba2fc04 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json @@ -581,7 +581,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -592,7 +592,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -629,6 +629,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json index 764d1b69b..f9563b6ca 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json @@ -612,7 +612,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -623,7 +623,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -660,6 +660,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json index 19295d6d5..f22102846 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json @@ -580,7 +580,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -591,7 +591,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -628,6 +628,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json index d19c5976a..3e433548d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json @@ -643,7 +643,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -654,7 +654,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -691,6 +691,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json index aba250e81..fad104cc0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json @@ -1,6 +1,6 @@ { "Resources": { - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -43,11 +43,11 @@ } } }, - "existingScriptLocationPolicy276EC326": { + "scrapBucketPolicy189B0607": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, "PolicyDocument": { "Statement": [ @@ -69,7 +69,7 @@ "Resource": [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -79,7 +79,7 @@ [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -106,7 +106,7 @@ [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -132,7 +132,7 @@ [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -156,7 +156,7 @@ } } }, - "existingScriptLocationAutoDeleteObjectsCustomResource0F729F9B": { + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { "Type": "Custom::S3AutoDeleteObjects", "Properties": { "ServiceToken": { @@ -166,11 +166,11 @@ ] }, "BucketName": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } }, "DependsOn": [ - "existingScriptLocationPolicy276EC326" + "scrapBucketPolicy189B0607" ], "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" @@ -204,7 +204,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -215,14 +215,14 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", [ "Lambda function for auto-deleting objects in ", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, " S3 bucket." ] @@ -472,7 +472,7 @@ { "DomainName": { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "RegionalDomainName" ] }, @@ -494,7 +494,7 @@ { "DomainName": { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "RegionalDomainName" ] }, @@ -560,6 +560,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts index d3709659b..7b5daaea0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts @@ -24,6 +24,7 @@ import { generateIntegStackName } from '@aws-solutions-constructs/core'; // Setup const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); let mybucket: s3.Bucket; mybucket = defaults.CreateScrapBucket(stack, { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json index 90c7acdf4..e5b92cc7a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json @@ -467,7 +467,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -478,7 +478,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -515,6 +515,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json index c232f3e04..aa73ded9b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json @@ -557,7 +557,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -568,7 +568,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -605,6 +605,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json index d8c3cb9d1..08a24d410 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json @@ -1383,7 +1383,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1394,7 +1394,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -1767,6 +1767,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json index 34063939e..8289c2e55 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json @@ -1383,7 +1383,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1394,7 +1394,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -1767,6 +1767,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json index 5f8c82564..1dcc7d488 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json @@ -550,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -561,7 +561,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -1768,6 +1768,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json index feeed0e4e..9383c2a97 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json @@ -557,7 +557,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json index ada3efa1f..9e9e1b4a9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json @@ -550,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -561,7 +561,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -1767,6 +1767,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json index 8e8164d32..9f38728ad 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json @@ -651,7 +651,6 @@ "Ref": "Vpc8378EB38" }, "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -667,7 +666,8 @@ "Key": "Name", "Value": "existing-resources/Vpc" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { @@ -771,7 +771,7 @@ "VpcEndpointType": "Gateway" } }, - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -814,11 +814,11 @@ } } }, - "existingScriptLocationPolicy276EC326": { + "scrapBucketPolicy189B0607": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, "PolicyDocument": { "Statement": [ @@ -840,7 +840,7 @@ "Resource": [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -850,7 +850,7 @@ [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -865,7 +865,7 @@ } } }, - "existingScriptLocationAutoDeleteObjectsCustomResource0F729F9B": { + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { "Type": "Custom::S3AutoDeleteObjects", "Properties": { "ServiceToken": { @@ -875,11 +875,11 @@ ] }, "BucketName": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } }, "DependsOn": [ - "existingScriptLocationPolicy276EC326" + "scrapBucketPolicy189B0607" ], "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" @@ -913,7 +913,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -924,14 +924,14 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", [ "Lambda function for auto-deleting objects in ", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, " S3 bucket." ] @@ -1110,7 +1110,7 @@ [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -1129,7 +1129,7 @@ "Resource": [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -1139,7 +1139,7 @@ [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -1159,7 +1159,7 @@ "Resource": [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -1169,7 +1169,7 @@ [ { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] }, @@ -1200,7 +1200,7 @@ "Name": "CUSTOM_ARN", "Value": { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] } @@ -1208,7 +1208,7 @@ { "Name": "CUSTOM_NAME", "Value": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } } ], diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts index 8ecb56e9c..9d5626943 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts @@ -24,6 +24,7 @@ const stack = new Stack(app, generateIntegStackName(__filename), { env: { account: Aws.ACCOUNT_ID, region: 'us-east-1' }, }); stack.templateOptions.description = 'Integration Test with existing VPC, Service and Bucket'; +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); const existingVpc = getTestVpc(stack); const existingBucket = defaults.CreateScrapBucket(stack, { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json index decf2394b..33929811a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json @@ -1378,7 +1378,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1389,7 +1389,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json index c3aba39ad..8f8b07b38 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json @@ -1,36 +1,23 @@ { "Resources": { - "S3Bucket07682993": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "aws:kms" + "SSEAlgorithm": "AES256" } } ] }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } - ] - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -40,37 +27,49 @@ "Metadata": { "cfn_nag": { "rules_to_suppress": [ + { + "id": "W51", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, { "id": "W35", - "reason": "This S3 bucket is created for unit/ integration testing purposes only." + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W41", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct" } ] } } }, - "S3BucketPolicyF560589A": { + "scrapBucketPolicy189B0607": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { - "Ref": "S3Bucket07682993" + "Ref": "scrapBucketB11863B7" }, "PolicyDocument": { "Statement": [ { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", "Principal": { - "AWS": "*" + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } }, "Resource": [ { "Fn::GetAtt": [ - "S3Bucket07682993", + "scrapBucketB11863B7", "Arn" ] }, @@ -80,7 +79,7 @@ [ { "Fn::GetAtt": [ - "S3Bucket07682993", + "scrapBucketB11863B7", "Arn" ] }, @@ -95,6 +94,101 @@ } } }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "testiots3integrationiotactionsrole04473665": { "Type": "AWS::IAM::Role", "Properties": { @@ -131,7 +225,7 @@ "Resource": [ { "Fn::GetAtt": [ - "S3Bucket07682993", + "scrapBucketB11863B7", "Arn" ] }, @@ -141,7 +235,7 @@ [ { "Fn::GetAtt": [ - "S3Bucket07682993", + "scrapBucketB11863B7", "Arn" ] }, @@ -170,7 +264,7 @@ { "S3": { "BucketName": { - "Ref": "S3Bucket07682993" + "Ref": "scrapBucketB11863B7" }, "Key": "test/${timestamp()}", "RoleArn": { @@ -189,6 +283,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.ts index e164a84f1..96f8a6f2b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.ts @@ -12,7 +12,7 @@ */ /// !cdk-integ * -import { App, RemovalPolicy, Stack } from "aws-cdk-lib"; +import { App, Stack } from "aws-cdk-lib"; import { IotToS3, IotToS3Props } from "../lib"; import * as defaults from '@aws-solutions-constructs/core'; import { generateIntegStackName } from '@aws-solutions-constructs/core'; @@ -20,14 +20,14 @@ import { BucketEncryption } from "aws-cdk-lib/aws-s3"; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); -const buildS3BucketResponse = defaults.buildS3Bucket(stack, { +const existingBucket = defaults.CreateScrapBucket(stack, { bucketProps: { - removalPolicy: RemovalPolicy.DESTROY, encryption: BucketEncryption.KMS_MANAGED, - }, - logS3AccessLogs: false + } }); + const props: IotToS3Props = { iotTopicRuleProps: { topicRulePayload: { @@ -37,15 +37,11 @@ const props: IotToS3Props = { actions: [] } }, - existingBucketInterface: buildS3BucketResponse.bucket, + existingBucketInterface: existingBucket, s3Key: 'test/${timestamp()}' }; -defaults.addCfnSuppressRules(buildS3BucketResponse.bucket, [ - { id: 'W35', - reason: 'This S3 bucket is created for unit/ integration testing purposes only.' }, -]); - new IotToS3(stack, 'test-iot-s3-integration', props); +defaults.suppressAutoDeleteHandlerWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json index b2eb06026..293bda90e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json @@ -1,7 +1,7 @@ { "Description": "Integration Test for aws-kinesisfirehose-s3", "Resources": { - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -13,6 +13,12 @@ } ] }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -38,6 +44,152 @@ } } }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "testfirehoses3preexistingbucketstackfirehoseloggroupC6AF6572": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", @@ -110,7 +262,7 @@ }, ":s3:::", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } ] ] @@ -125,7 +277,7 @@ }, ":s3:::", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, "/*" ] @@ -193,7 +345,7 @@ }, ":s3:::", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } ] ] @@ -246,6 +398,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts index 2bb91a27d..136265003 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts @@ -14,7 +14,7 @@ // Imports import { App, Stack } from "aws-cdk-lib"; import { KinesisFirehoseToS3 } from "../lib"; -import { CreateScrapBucket } from '@aws-solutions-constructs/core'; +import { CreateScrapBucket, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; import * as s3 from "aws-cdk-lib/aws-s3"; import { generateIntegStackName } from '@aws-solutions-constructs/core'; @@ -23,6 +23,7 @@ const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); stack.templateOptions.description = 'Integration Test for aws-kinesisfirehose-s3'; +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); const existingBucket = CreateScrapBucket(stack, {}); @@ -30,6 +31,7 @@ const mybucket: s3.IBucket = s3.Bucket.fromBucketName(stack, 'mybucket', existin new KinesisFirehoseToS3(stack, 'test-firehose-s3-pre-existing-bucket-stack', { existingBucketObj: mybucket, }); +suppressAutoDeleteHandlerWarnings(stack); // Synth app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json index fe7c6e211..1d092a359 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json @@ -1,10 +1,9 @@ { "Description": "Integration Test for aws-kinesisfirehose-s3", "Resources": { - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -14,6 +13,12 @@ } ] }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -39,6 +44,188 @@ } } }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testfirehoses3preexistingloggingbucketstackS3BucketD14D0F4F", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "testfirehoses3preexistingloggingbucketstackS3BucketD14D0F4F": { "Type": "AWS::S3::Bucket", "Properties": { @@ -66,7 +253,7 @@ }, "LoggingConfiguration": { "DestinationBucketName": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } }, "PublicAccessBlockConfiguration": { @@ -75,6 +262,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -123,12 +316,69 @@ ] } ] + }, + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testfirehoses3preexistingloggingbucketstackS3BucketD14D0F4F", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testfirehoses3preexistingloggingbucketstackS3BucketD14D0F4F", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "testfirehoses3preexistingloggingbucketstackS3BucketAutoDeleteObjectsCustomResourceB90405F0": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testfirehoses3preexistingloggingbucketstackS3BucketD14D0F4F" + } + }, + "DependsOn": [ + "testfirehoses3preexistingloggingbucketstackS3BucketPolicyB1086848" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testfirehoses3preexistingloggingbucketstackfirehoseloggroup38D768AE": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", @@ -317,6 +567,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.ts index 17857f15b..12d84b50e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.ts @@ -12,9 +12,8 @@ */ // Imports -import * as s3 from 'aws-cdk-lib/aws-s3'; import { App, Stack, RemovalPolicy } from 'aws-cdk-lib'; -import { CreateScrapBucket } from '@aws-solutions-constructs/core'; +import { CreateScrapBucket, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; import { KinesisFirehoseToS3 } from '../lib'; import { generateIntegStackName } from '@aws-solutions-constructs/core'; @@ -22,18 +21,19 @@ import { generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); stack.templateOptions.description = 'Integration Test for aws-kinesisfirehose-s3'; +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); const existingBucket = CreateScrapBucket(stack, { - accessControl: s3.BucketAccessControl.LOG_DELIVERY_WRITE, }); -const myLoggingBucket: s3.IBucket = s3.Bucket.fromBucketName(stack, 'myLoggingBucket', existingBucket.bucketName); new KinesisFirehoseToS3(stack, 'test-firehose-s3-pre-existing-logging-bucket-stack', { - existingLoggingBucketObj: myLoggingBucket, bucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + serverAccessLogsBucket: existingBucket } }); +suppressAutoDeleteHandlerWarnings(stack); // Synth app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json index 01616e5c9..539088bd0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json @@ -1,7 +1,7 @@ { "Description": "Integration Test for aws-kinesisstreams-kinesisfirehose-s3", "Resources": { - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -13,6 +13,12 @@ } ] }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -38,6 +44,152 @@ } } }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "testexistingbucketfirehoses3stackKinesisStreamCA3487EE": { "Type": "AWS::Kinesis::Stream", "Properties": { @@ -121,7 +273,7 @@ }, ":s3:::", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } ] ] @@ -136,7 +288,7 @@ }, ":s3:::", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, "/*" ] @@ -202,7 +354,7 @@ }, ":s3:::", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } ] ] @@ -337,6 +489,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.ts index d3c8060d1..8c084e09b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.ts @@ -14,7 +14,7 @@ // Imports import * as s3 from 'aws-cdk-lib/aws-s3'; import { App, Stack, RemovalPolicy } from 'aws-cdk-lib'; -import { CreateScrapBucket } from '@aws-solutions-constructs/core'; +import { CreateScrapBucket, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; import { KinesisStreamsToKinesisFirehoseToS3 } from '../lib'; import { generateIntegStackName } from '@aws-solutions-constructs/core'; @@ -22,6 +22,7 @@ import { generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); stack.templateOptions.description = 'Integration Test for aws-kinesisstreams-kinesisfirehose-s3'; +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); const existingBucket = CreateScrapBucket(stack, { removalPolicy: RemovalPolicy.DESTROY }); const mybucket: s3.IBucket = s3.Bucket.fromBucketName(stack, 'mybucket', existingBucket.bucketName); @@ -31,6 +32,7 @@ new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-existing-bucket-firehose-s3 removalPolicy: RemovalPolicy.DESTROY } }); +suppressAutoDeleteHandlerWarnings(stack); // Synth app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json index b0ac9581b..3e67087bf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json @@ -1,10 +1,9 @@ { "Description": "Integration Test for aws-kinesisstreams-kinesisfirehose-s3", "Resources": { - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -14,6 +13,12 @@ } ] }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -39,6 +44,152 @@ } } }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "testexistingloggingbucketstreamsfirehoses3stackKinesisStreamDBBCC46F": { "Type": "AWS::Kinesis::Stream", "Properties": { @@ -77,7 +228,7 @@ }, "LoggingConfiguration": { "DestinationBucketName": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } }, "PublicAccessBlockConfiguration": { @@ -408,6 +559,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.ts index 0a8fc9179..c5ff2a5f6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.ts @@ -14,7 +14,7 @@ // Imports import * as s3 from 'aws-cdk-lib/aws-s3'; import { App, Stack, RemovalPolicy } from 'aws-cdk-lib'; -import { CreateScrapBucket } from '@aws-solutions-constructs/core'; +import { CreateScrapBucket, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; import { KinesisStreamsToKinesisFirehoseToS3 } from '../lib'; import { generateIntegStackName } from '@aws-solutions-constructs/core'; @@ -22,9 +22,9 @@ import { generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); stack.templateOptions.description = 'Integration Test for aws-kinesisstreams-kinesisfirehose-s3'; +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); const existingBucket = CreateScrapBucket(stack, { - accessControl: s3.BucketAccessControl.LOG_DELIVERY_WRITE, bucketProps: { removalPolicy: RemovalPolicy.DESTROY, } @@ -40,6 +40,7 @@ new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-existing-logging-bucket-str removalPolicy: RemovalPolicy.DESTROY } }); +suppressAutoDeleteHandlerWarnings(stack); // Synth app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json index 27eef443e..b2ff686f1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json @@ -550,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -561,7 +561,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -706,6 +706,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json index 82b3555ee..0c3273c35 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json @@ -550,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -561,7 +561,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -1587,6 +1587,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json index abdfd3683..ceb539324 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json @@ -550,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -561,7 +561,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -1193,6 +1193,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json index 6f7734d7f..0c347bb90 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json @@ -550,7 +550,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" }, "Timeout": 900, "MemorySize": 128, @@ -561,7 +561,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", @@ -751,6 +751,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json index 8ca6bc3ed..141f895da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json @@ -1,7 +1,7 @@ { "Description": "Integration Test for aws-lambda-s3", "Resources": { - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -13,6 +13,12 @@ } ] }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -38,6 +44,152 @@ } } }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "testlambdas3preexistingbucketLambdaFunctionServiceRole9AC7CED0": { "Type": "AWS::IAM::Role", "Properties": { @@ -131,7 +283,7 @@ }, ":s3:::", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } ] ] @@ -146,7 +298,7 @@ }, ":s3:::", { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, "/*" ] @@ -194,7 +346,7 @@ "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "S3_BUCKET_NAME": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } } }, @@ -228,6 +380,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts index 24ed2047b..b109470f8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts @@ -16,13 +16,15 @@ import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { LambdaToS3, LambdaToS3Props } from "../lib"; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as s3 from 'aws-cdk-lib/aws-s3'; -import { CreateScrapBucket } from '@aws-solutions-constructs/core'; +import { CreateScrapBucket, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; import { generateIntegStackName } from '@aws-solutions-constructs/core'; // Setup const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); stack.templateOptions.description = 'Integration Test for aws-lambda-s3'; +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + const existingBucket = CreateScrapBucket(stack, { removalPolicy: RemovalPolicy.DESTROY }); const mybucket: s3.IBucket = s3.Bucket.fromBucketName(stack, 'mybucket', existingBucket.bucketName); @@ -37,6 +39,7 @@ const props: LambdaToS3Props = { }; new LambdaToS3(stack, 'test-lambda-s3-pre-existing-bucket', props); +suppressAutoDeleteHandlerWarnings(stack); // Synth app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts index de17381ff..a8c51de75 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts @@ -309,7 +309,7 @@ test('Test lambda function custom environment variable', () => { Variables: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', CUSTOM_BUCKET_NAME: { - Ref: 'existingScriptLocation845F3C51' + Ref: 'scrapBucketB11863B7' } } } diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json index bb9879aff..7cc0131dc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json @@ -221,14 +221,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -680,7 +673,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json index 44abeb893..2d1df8163 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json @@ -890,14 +890,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -1071,7 +1064,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json index a2eca0958..9e5b5818b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json @@ -219,14 +219,7 @@ ] }, { - "Action": [ - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*" - ], + "Action": "s3:PutObject", "Effect": "Allow", "Principal": { "AWS": { @@ -1069,7 +1062,7 @@ "Arn" ] }, - "Runtime": "nodejs14.x", + "Runtime": "nodejs16.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json index dac0c3663..78f15a1ef 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json @@ -1,6 +1,6 @@ { "Resources": { - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -12,6 +12,12 @@ } ] }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -37,7 +43,77 @@ } } }, - "existingScriptLocationNotificationsC550EA17": { + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "scrapBucketNotifications065035E3": { "Type": "Custom::S3BucketNotifications", "Properties": { "ServiceToken": { @@ -47,7 +123,7 @@ ] }, "BucketName": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, "NotificationConfiguration": { "LambdaFunctionConfigurations": [ @@ -67,10 +143,10 @@ "Managed": true }, "DependsOn": [ - "existingScriptLocationAllowBucketNotificationsToexistings3buckettests3lambdaLambdaFunction4D27058539722111" + "scrapBucketAllowBucketNotificationsToexistings3buckettests3lambdaLambdaFunction4D270585E171492B" ] }, - "existingScriptLocationAllowBucketNotificationsToexistings3buckettests3lambdaLambdaFunction4D27058539722111": { + "scrapBucketAllowBucketNotificationsToexistings3buckettests3lambdaLambdaFunction4D270585E171492B": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -86,12 +162,88 @@ }, "SourceArn": { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] } } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "tests3lambdaLambdaFunctionServiceRoleA74F4427": { "Type": "AWS::IAM::Role", "Properties": { @@ -333,6 +485,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts index 2ff9ac1e0..ddedd7bbf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts @@ -15,13 +15,14 @@ import { App, Stack } from "aws-cdk-lib"; import { S3ToLambda, S3ToLambdaProps } from "../lib"; import * as lambda from 'aws-cdk-lib/aws-lambda'; -import { CreateScrapBucket } from "@aws-solutions-constructs/core"; +import { CreateScrapBucket, suppressAutoDeleteHandlerWarnings } from "@aws-solutions-constructs/core"; import { generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); // Empty arguments const stack = new Stack(app, generateIntegStackName(__filename)); +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); const myBucket = CreateScrapBucket(stack, {}); @@ -35,4 +36,6 @@ const props: S3ToLambdaProps = { }; new S3ToLambda(stack, 'test-s3-lambda', props); + +suppressAutoDeleteHandlerWarnings(stack); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json index cef9ef363..ff8376880 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json @@ -1,6 +1,6 @@ { "Resources": { - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -12,6 +12,12 @@ } ] }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -37,7 +43,77 @@ } } }, - "existingScriptLocationNotificationsC550EA17": { + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "scrapBucketNotifications065035E3": { "Type": "Custom::S3BucketNotifications", "Properties": { "ServiceToken": { @@ -47,7 +123,7 @@ ] }, "BucketName": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, "NotificationConfiguration": { "TopicConfigurations": [ @@ -68,6 +144,82 @@ "tests3snsSnsTopicF02F6BD0" ] }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "tests3snsEncryptionKey6C553584": { "Type": "AWS::KMS::Key", "Properties": { @@ -206,7 +358,7 @@ "ArnLike": { "aws:SourceArn": { "Fn::GetAtt": [ - "existingScriptLocation845F3C51", + "scrapBucketB11863B7", "Arn" ] } @@ -334,6 +486,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.ts index 025898c3a..d1c8e2c01 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.ts @@ -14,13 +14,15 @@ /// !cdk-integ * import { App, Stack } from "aws-cdk-lib"; import { S3ToSns } from "../lib"; -import { CreateScrapBucket, generateIntegStackName } from '@aws-solutions-constructs/core'; +import { CreateScrapBucket, generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); new S3ToSns(stack, 'test-s3-sns', { existingBucketObj: CreateScrapBucket(stack) }); +suppressAutoDeleteHandlerWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json new file mode 100644 index 000000000..87a76dc7c --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json @@ -0,0 +1,924 @@ +{ + "Resources": { + "scrapBucketB11863B7": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W51", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W35", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W41", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct" + } + ] + } + } + }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3sqstempS3Bucket579C3000", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, + "tests3sqstempS3Bucket579C3000": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "LifecycleConfiguration": { + "Rules": [ + { + "NoncurrentVersionTransitions": [ + { + "StorageClass": "GLACIER", + "TransitionInDays": 90 + } + ], + "Status": "Enabled" + } + ] + }, + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "tests3sqstempS3BucketPolicy1DE71896": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "tests3sqstempS3Bucket579C3000" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3sqstempS3Bucket579C3000", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3sqstempS3Bucket579C3000", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3sqstempS3Bucket579C3000", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3sqstempS3Bucket579C3000", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "tests3sqstempS3BucketAutoDeleteObjectsCustomResource23CDC6A9": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3sqstempS3Bucket579C3000" + } + }, + "DependsOn": [ + "tests3sqstempS3BucketPolicy1DE71896" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "tests3sqstempS3BucketNotificationsE2A27A09": { + "Type": "Custom::S3BucketNotifications", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3sqstempS3Bucket579C3000" + }, + "NotificationConfiguration": { + "QueueConfigurations": [ + { + "Events": [ + "s3:ObjectCreated:*" + ], + "QueueArn": { + "Fn::GetAtt": [ + "tests3sqstempqueueE6526813", + "Arn" + ] + } + } + ] + }, + "Managed": true + }, + "DependsOn": [ + "tests3sqstempqueuePolicy6C62431A", + "tests3sqstempqueueE6526813" + ] + }, + "tests3sqstempdeadLetterQueueDD55EEDB": { + "Type": "AWS::SQS::Queue", + "Properties": { + "KmsMasterKeyId": "alias/aws/sqs" + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "tests3sqstempdeadLetterQueuePolicy56962C75": { + "Type": "AWS::SQS::QueuePolicy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "sqs:DeleteMessage", + "sqs:ReceiveMessage", + "sqs:SendMessage", + "sqs:GetQueueAttributes", + "sqs:RemovePermission", + "sqs:AddPermission", + "sqs:SetQueueAttributes" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": { + "Fn::GetAtt": [ + "tests3sqstempdeadLetterQueueDD55EEDB", + "Arn" + ] + }, + "Sid": "QueueOwnerOnlyAccess" + }, + { + "Action": "SQS:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": { + "Fn::GetAtt": [ + "tests3sqstempdeadLetterQueueDD55EEDB", + "Arn" + ] + }, + "Sid": "HttpsOnly" + } + ], + "Version": "2012-10-17" + }, + "Queues": [ + { + "Ref": "tests3sqstempdeadLetterQueueDD55EEDB" + } + ] + } + }, + "tests3sqstempEncryptionKey57CC85E2": { + "Type": "AWS::KMS::Key", + "Properties": { + "KeyPolicy": { + "Statement": [ + { + "Action": "kms:*", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": "*" + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*" + ], + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3sqstempS3Bucket579C3000", + "Arn" + ] + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "s3.amazonaws.com" + }, + "Resource": "*" + }, + { + "Action": [ + "kms:GenerateDataKey*", + "kms:Decrypt" + ], + "Effect": "Allow", + "Principal": { + "Service": "s3.amazonaws.com" + }, + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "EnableKeyRotation": true + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "tests3sqstempqueueE6526813": { + "Type": "AWS::SQS::Queue", + "Properties": { + "KmsMasterKeyId": { + "Fn::GetAtt": [ + "tests3sqstempEncryptionKey57CC85E2", + "Arn" + ] + }, + "RedrivePolicy": { + "deadLetterTargetArn": { + "Fn::GetAtt": [ + "tests3sqstempdeadLetterQueueDD55EEDB", + "Arn" + ] + }, + "maxReceiveCount": 15 + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "tests3sqstempqueuePolicy6C62431A": { + "Type": "AWS::SQS::QueuePolicy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "sqs:DeleteMessage", + "sqs:ReceiveMessage", + "sqs:SendMessage", + "sqs:GetQueueAttributes", + "sqs:RemovePermission", + "sqs:AddPermission", + "sqs:SetQueueAttributes" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": { + "Fn::GetAtt": [ + "tests3sqstempqueueE6526813", + "Arn" + ] + }, + "Sid": "QueueOwnerOnlyAccess" + }, + { + "Action": "SQS:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": { + "Fn::GetAtt": [ + "tests3sqstempqueueE6526813", + "Arn" + ] + }, + "Sid": "HttpsOnly" + }, + { + "Action": [ + "sqs:SendMessage", + "sqs:GetQueueAttributes", + "sqs:GetQueueUrl" + ], + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "tests3sqstempS3Bucket579C3000", + "Arn" + ] + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "s3.amazonaws.com" + }, + "Resource": { + "Fn::GetAtt": [ + "tests3sqstempqueueE6526813", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "Queues": [ + { + "Ref": "tests3sqstempqueueE6526813" + } + ] + } + }, + "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" + ] + ] + } + ] + } + }, + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:PutBucketNotification", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", + "Roles": [ + { + "Ref": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Bucket resource is '*' due to circular dependency with bucket and role creation at the same time" + } + ] + } + } + }, + "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Description": "AWS CloudFormation handler for \"Custom::S3BucketNotifications\" resources (@aws-cdk/aws-s3)", + "Code": { + "ZipFile": "import boto3 # type: ignore\nimport json\nimport logging\nimport urllib.request\n\ns3 = boto3.client(\"s3\")\n\nEVENTBRIDGE_CONFIGURATION = 'EventBridgeConfiguration'\n\nCONFIGURATION_TYPES = [\"TopicConfigurations\", \"QueueConfigurations\", \"LambdaFunctionConfigurations\"]\n\ndef handler(event: dict, context):\n response_status = \"SUCCESS\"\n error_message = \"\"\n try:\n props = event[\"ResourceProperties\"]\n bucket = props[\"BucketName\"]\n notification_configuration = props[\"NotificationConfiguration\"]\n request_type = event[\"RequestType\"]\n managed = props.get('Managed', 'true').lower() == 'true'\n stack_id = event['StackId']\n\n if managed:\n config = handle_managed(request_type, notification_configuration)\n else:\n config = handle_unmanaged(bucket, stack_id, request_type, notification_configuration)\n\n put_bucket_notification_configuration(bucket, config)\n except Exception as e:\n logging.exception(\"Failed to put bucket notification configuration\")\n response_status = \"FAILED\"\n error_message = f\"Error: {str(e)}. \"\n finally:\n submit_response(event, context, response_status, error_message)\n\ndef handle_managed(request_type, notification_configuration):\n if request_type == 'Delete':\n return {}\n return notification_configuration\n\ndef handle_unmanaged(bucket, stack_id, request_type, notification_configuration):\n external_notifications = find_external_notifications(bucket, stack_id)\n\n if request_type == 'Delete':\n return external_notifications\n\n def with_id(notification):\n notification['Id'] = f\"{stack_id}-{hash(json.dumps(notification, sort_keys=True))}\"\n return notification\n\n notifications = {}\n for t in CONFIGURATION_TYPES:\n external = external_notifications.get(t, [])\n incoming = [with_id(n) for n in notification_configuration.get(t, [])]\n notifications[t] = external + incoming\n\n if EVENTBRIDGE_CONFIGURATION in notification_configuration:\n notifications[EVENTBRIDGE_CONFIGURATION] = notification_configuration[EVENTBRIDGE_CONFIGURATION]\n elif EVENTBRIDGE_CONFIGURATION in external_notifications:\n notifications[EVENTBRIDGE_CONFIGURATION] = external_notifications[EVENTBRIDGE_CONFIGURATION]\n\n return notifications\n\ndef find_external_notifications(bucket, stack_id):\n existing_notifications = get_bucket_notification_configuration(bucket)\n external_notifications = {}\n for t in CONFIGURATION_TYPES:\n external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f\"{stack_id}-\")]\n\n if EVENTBRIDGE_CONFIGURATION in existing_notifications:\n external_notifications[EVENTBRIDGE_CONFIGURATION] = existing_notifications[EVENTBRIDGE_CONFIGURATION]\n\n return external_notifications\n\ndef get_bucket_notification_configuration(bucket):\n return s3.get_bucket_notification_configuration(Bucket=bucket)\n\ndef put_bucket_notification_configuration(bucket, notification_configuration):\n s3.put_bucket_notification_configuration(Bucket=bucket, NotificationConfiguration=notification_configuration)\n\ndef submit_response(event: dict, context, response_status: str, error_message: str):\n response_body = json.dumps(\n {\n \"Status\": response_status,\n \"Reason\": f\"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}\",\n \"PhysicalResourceId\": event.get(\"PhysicalResourceId\") or event[\"LogicalResourceId\"],\n \"StackId\": event[\"StackId\"],\n \"RequestId\": event[\"RequestId\"],\n \"LogicalResourceId\": event[\"LogicalResourceId\"],\n \"NoEcho\": False,\n }\n ).encode(\"utf-8\")\n headers = {\"content-type\": \"\", \"content-length\": str(len(response_body))}\n try:\n req = urllib.request.Request(url=event[\"ResponseURL\"], headers=headers, data=response_body, method=\"PUT\")\n with urllib.request.urlopen(req) as response:\n print(response.read().decode(\"utf-8\"))\n print(\"Status code: \" + response.reason)\n except Exception as e:\n print(\"send(..) failed executing request.urlopen(..): \" + str(e))\n" + }, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", + "Arn" + ] + }, + "Runtime": "python3.9", + "Timeout": 300 + }, + "DependsOn": [ + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + } + }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.ts new file mode 100644 index 000000000..e94794b7e --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.ts @@ -0,0 +1,39 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +/// !cdk-integ * +import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; +import { S3ToSqs, S3ToSqsProps } from "../lib"; +import * as defaults from '@aws-solutions-constructs/core'; +import { generateIntegStackName } from '@aws-solutions-constructs/core'; + +const app = new App(); + +const stack = new Stack(app, generateIntegStackName(__filename)); +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + +const scrapLogBucket = defaults.CreateScrapBucket(stack); + +// Currently there is no way to customize the logging bucket, so this +// test will leave a bucket behind +const props: S3ToSqsProps = { + bucketProps: { + serverAccessLogsBucket: scrapLogBucket, + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true + } +}; +defaults.suppressAutoDeleteHandlerWarnings(stack); + +new S3ToSqs(stack, 'test-s3-sqs-temp', props); +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json index 8945fb5c4..8cf18e55b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json @@ -1,9 +1,8 @@ { "Resources": { - "S3LoggingBucket800A2B27": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { @@ -13,12 +12,12 @@ } ] }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -28,37 +27,49 @@ "Metadata": { "cfn_nag": { "rules_to_suppress": [ + { + "id": "W51", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, { "id": "W35", - "reason": "This S3 bucket is used as the access logging bucket for another bucket" + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W41", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct" } ] } } }, - "S3LoggingBucketPolicy6B3AA8AF": { + "scrapBucketPolicy189B0607": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { - "Ref": "S3LoggingBucket800A2B27" + "Ref": "scrapBucketB11863B7" }, "PolicyDocument": { "Statement": [ { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", "Principal": { - "AWS": "*" + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } }, "Resource": [ { "Fn::GetAtt": [ - "S3LoggingBucket800A2B27", + "scrapBucketB11863B7", "Arn" ] }, @@ -68,7 +79,7 @@ [ { "Fn::GetAtt": [ - "S3LoggingBucket800A2B27", + "scrapBucketB11863B7", "Arn" ] }, @@ -83,97 +94,26 @@ } } }, - "S3Bucket07682993": { - "Type": "AWS::S3::Bucket", + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" ] }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "S3LoggingBucket800A2B27" - } - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" + "BucketName": { + "Ref": "scrapBucketB11863B7" } }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" }, - "S3BucketPolicyF560589A": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "S3Bucket07682993" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "S3Bucket07682993", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "S3Bucket07682993", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - } - ], - "Version": "2012-10-17" - } - } - }, - "S3BucketNotifications58B5AD06": { + "scrapBucketNotifications065035E3": { "Type": "Custom::S3BucketNotifications", "Properties": { "ServiceToken": { @@ -183,7 +123,7 @@ ] }, "BucketName": { - "Ref": "S3Bucket07682993" + "Ref": "scrapBucketB11863B7" }, "NotificationConfiguration": { "QueueConfigurations": [ @@ -207,6 +147,82 @@ "tests3sqsqueue810CCE19" ] }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "tests3sqsdeadLetterQueueEABBC814": { "Type": "AWS::SQS::Queue", "Properties": { @@ -325,7 +341,7 @@ "ArnLike": { "aws:SourceArn": { "Fn::GetAtt": [ - "S3Bucket07682993", + "scrapBucketB11863B7", "Arn" ] } @@ -449,7 +465,7 @@ "ArnLike": { "aws:SourceArn": { "Fn::GetAtt": [ - "S3Bucket07682993", + "scrapBucketB11863B7", "Arn" ] } @@ -579,6 +595,109 @@ } } }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.ts index ad381b56a..f3e5302d8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.ts @@ -12,7 +12,7 @@ */ /// !cdk-integ * -import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; +import { App, Stack } from "aws-cdk-lib"; import { S3ToSqs, S3ToSqsProps } from "../lib"; import * as defaults from '@aws-solutions-constructs/core'; import { generateIntegStackName } from '@aws-solutions-constructs/core'; @@ -20,14 +20,17 @@ import { generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); -const buildS3BucketResponse = defaults.buildS3Bucket(stack, { bucketProps: { removalPolicy: RemovalPolicy.DESTROY }, }); +const newExternalBucket = defaults.CreateScrapBucket(stack); // Currently there is no way to customize the logging bucket, so this // test will leave a bucket behind const props: S3ToSqsProps = { - existingBucketObj: buildS3BucketResponse.bucket, + existingBucketObj: newExternalBucket, }; new S3ToSqs(stack, 'test-s3-sqs', props); +defaults.suppressAutoDeleteHandlerWarnings(stack); + app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json index 6fcc7914c..75e7f4052 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json @@ -1,6 +1,6 @@ { "Resources": { - "existingScriptLocation845F3C51": { + "scrapBucketB11863B7": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -12,6 +12,12 @@ } ] }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -37,7 +43,77 @@ } } }, - "existingScriptLocationNotificationsC550EA17": { + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "scrapBucketNotifications065035E3": { "Type": "Custom::S3BucketNotifications", "Properties": { "ServiceToken": { @@ -47,7 +123,7 @@ ] }, "BucketName": { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" }, "NotificationConfiguration": { "EventBridgeConfiguration": {} @@ -55,6 +131,82 @@ "Managed": true } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -356,7 +508,7 @@ "bucket": { "name": [ { - "Ref": "existingScriptLocation845F3C51" + "Ref": "scrapBucketB11863B7" } ] } @@ -444,6 +596,107 @@ } }, "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + }, "ServiceprincipalMap": { "af-south-1": { "states": "states.af-south-1.amazonaws.com" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.ts index f8ecc4893..676679b09 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.ts @@ -15,12 +15,13 @@ import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { S3ToStepfunctions, S3ToStepfunctionsProps } from "../lib"; import * as stepfunctions from 'aws-cdk-lib/aws-stepfunctions'; -import { CreateScrapBucket, generateIntegStackName, addCfnNagS3BucketNotificationRulesToSuppress } from '@aws-solutions-constructs/core'; +import * as defaults from '@aws-solutions-constructs/core'; const app = new App(); -const stack = new Stack(app, generateIntegStackName(__filename)); +const stack = new Stack(app, defaults.generateIntegStackName(__filename)); +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); -const existingBucket = CreateScrapBucket(stack, { +const existingBucket = defaults.CreateScrapBucket(stack, { eventBridgeEnabled: true }); @@ -40,6 +41,7 @@ const props: S3ToStepfunctionsProps = { new S3ToStepfunctions(stack, 'test-s3-stepfunctions-pre-existing-bucket-construct', props); -addCfnNagS3BucketNotificationRulesToSuppress(stack, 'BucketNotificationsHandler050a0587b7544547bf325f094a3db834'); +defaults.addCfnNagS3BucketNotificationRulesToSuppress(stack, 'BucketNotificationsHandler050a0587b7544547bf325f094a3db834'); +defaults.suppressAutoDeleteHandlerWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/core/test/test-helper.ts b/source/patterns/@aws-solutions-constructs/core/test/test-helper.ts index 056e94de5..8573221a6 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/test-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/test-helper.ts @@ -31,9 +31,11 @@ export const fakeEcrRepoArn = 'arn:aws:ecr:us-east-1:123456789012:repository/fak // Creates a bucket used for testing - minimal properties, destroyed after test export function CreateScrapBucket(scope: Construct, props?: BucketProps | any) { - const defaultProps = { + + const defaultProps: BucketProps = { versioned: true, removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, encryption: BucketEncryption.S3_MANAGED, }; @@ -46,7 +48,7 @@ export function CreateScrapBucket(scope: Construct, props?: BucketProps | any) { const scriptBucket = new Bucket( scope, - "existingScriptLocation", + "scrapBucket", synthesizedProps ); diff --git a/source/tools/cdk-integ-tools/package.json b/source/tools/cdk-integ-tools/package.json index dd7f58eda..b621fb506 100644 --- a/source/tools/cdk-integ-tools/package.json +++ b/source/tools/cdk-integ-tools/package.json @@ -32,12 +32,12 @@ "@types/node": "18.11.9", "tslint": "^5.20.1", "typescript": "~3.9.10", - "aws-cdk-lib": "2.71.0", + "aws-cdk-lib": "2.81.0", "constructs": "^10.0.0" }, "dependencies": { - "@aws-cdk/cloudformation-diff": "2.71.0", - "aws-cdk": "2.71.0", + "@aws-cdk/cloudformation-diff": "2.81.0", + "aws-cdk": "2.81.0", "fs-extra": "^9.0.1", "yargs": "^16.1.1", "deepmerge": "^4.0.0" @@ -54,7 +54,7 @@ "node": ">= 10.3.0" }, "peerDependencies": { - "aws-cdk-lib": "^2.71.0", + "aws-cdk-lib": "^2.81.0", "constructs": "^10.0.0" } -} +} \ No newline at end of file diff --git a/source/use_cases/aws-custom-glue-etl/test/integ.gluejob.expected.json b/source/use_cases/aws-custom-glue-etl/test/integ.gluejob.expected.json index 684fdc1ef..189a79f23 100644 --- a/source/use_cases/aws-custom-glue-etl/test/integ.gluejob.expected.json +++ b/source/use_cases/aws-custom-glue-etl/test/integ.gluejob.expected.json @@ -210,7 +210,6 @@ "CustomETLS3LoggingBucketBBDD45CB": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { diff --git a/source/use_cases/aws-restaurant-management-demo/test/integ.basic-deployment.expected.json b/source/use_cases/aws-restaurant-management-demo/test/integ.basic-deployment.expected.json index 2d19e9dd9..3b355bac2 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/integ.basic-deployment.expected.json +++ b/source/use_cases/aws-restaurant-management-demo/test/integ.basic-deployment.expected.json @@ -3,7 +3,6 @@ "CloudFrontToS3S3LoggingBucketEF5CD8B2": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { diff --git a/source/use_cases/aws-s3-static-website/test/integ.basic-deployment.expected.json b/source/use_cases/aws-s3-static-website/test/integ.basic-deployment.expected.json index f7289e228..02414ceb2 100644 --- a/source/use_cases/aws-s3-static-website/test/integ.basic-deployment.expected.json +++ b/source/use_cases/aws-s3-static-website/test/integ.basic-deployment.expected.json @@ -3,7 +3,6 @@ "CloudFrontToS3S3LoggingBucketEF5CD8B2": { "Type": "AWS::S3::Bucket", "Properties": { - "AccessControl": "LogDeliveryWrite", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { From 8877cbf11b417c4f877ddc64108c67ab1f2b1e9c Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Sat, 3 Jun 2023 08:35:30 -0400 Subject: [PATCH 21/73] Address Issue965 (#969) --- .../README.md | 1 + .../eventbridge-kinesisfirehose-s3.test.ts | 26 +- .../integ.existingLoggingBucket.expected.json | 714 ++++++++++++++++++ .../test/integ.existingLoggingBucket.ts | 43 ++ .../core/lib/s3-bucket-helper.ts | 3 - .../core/test/s3-bucket-helper.test.ts | 20 + 6 files changed, 803 insertions(+), 4 deletions(-) create mode 100644 source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/README.md b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/README.md index 277d47fba..feef1a2c2 100755 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/README.md @@ -87,6 +87,7 @@ new EventbridgeToKinesisFirehoseToS3(this, "test-eventbridge-firehose-s3", |loggingBucketProps?|[`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html)|Optional user provided props to override the default props for the S3 Logging Bucket.| |logS3AccessLogs?| boolean|Whether to turn on Access Logging for the S3 bucket. Creates an S3 bucket with associated storage costs for the logs. Enabling Access Logging is a best practice. default - true| +NOTE: `existingLoggingBucketObj` has been deprecated - to specify an existing Log Bucket, use bucketProps.serverAccessLogsBucket ## Pattern Properties | **Name** | **Type** | **Description** | diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts index f15b1394a..d6cd33a6f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts @@ -16,6 +16,7 @@ import * as s3 from "aws-cdk-lib/aws-s3"; import * as events from "aws-cdk-lib/aws-events"; import { Template } from 'aws-cdk-lib/assertions'; import { EventbridgeToKinesisFirehoseToS3, EventbridgeToKinesisFirehoseToS3Props } from '../lib'; +import * as defaults from '@aws-solutions-constructs/core'; // -------------------------------------------------------------- // Test snapshot match with default parameters @@ -266,4 +267,27 @@ test('s3 bucket with one content bucket and no logging bucket', () => { const template = Template.fromStack(stack); template.resourceCountIs("AWS::S3::Bucket", 1); -}); \ No newline at end of file +}); + +test('Supply an existing logging bucket', () => { + const stack = new cdk.Stack(); + const logBucketName = 'log-bucket-name'; + + const logBucket = defaults.CreateScrapBucket(stack, { + bucketName: logBucketName + }); + + new EventbridgeToKinesisFirehoseToS3(stack, 'with-existing-log-bucket', { + eventRuleProps: { + description: 'event rule props', + schedule: events.Schedule.rate(cdk.Duration.minutes(5)) + }, + bucketProps: { + serverAccessLogsBucket: logBucket + } + }); + + const template = Template.fromStack(stack); + template.resourceCountIs("AWS::S3::Bucket", 2); + +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json new file mode 100644 index 000000000..1112c6531 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json @@ -0,0 +1,714 @@ +{ + "Resources": { + "scrapBucketB11863B7": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W51", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W35", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W41", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct" + } + ] + } + } + }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, + "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "LifecycleConfiguration": { + "Rules": [ + { + "NoncurrentVersionTransitions": [ + { + "StorageClass": "GLACIER", + "TransitionInDays": 90 + } + ], + "Status": "Enabled" + } + ] + }, + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + }, + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "testkinesisfirehoses3KinesisFirehoseToS3S3BucketPolicy46BDB29D": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W86", + "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" + }, + { + "id": "W84", + "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" + } + ] + } + } + }, + "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstreamEC0EA660": { + "Type": "AWS::Logs::LogStream", + "Properties": { + "LogGroupName": { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5" + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRole18870C08": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "firehose.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicyD6A1BC51": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:AbortMultipartUpload", + "s3:GetBucketLocation", + "s3:GetObject", + "s3:ListBucket", + "s3:ListBucketMultipartUploads", + "s3:PutObject" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "logs:PutLogEvents", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:", + { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5" + }, + ":log-stream:", + { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstreamEC0EA660" + } + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicyD6A1BC51", + "Roles": [ + { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRole18870C08" + } + ] + } + }, + "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D": { + "Type": "AWS::KinesisFirehose::DeliveryStream", + "Properties": { + "DeliveryStreamEncryptionConfigurationInput": { + "KeyType": "AWS_OWNED_CMK" + }, + "DeliveryStreamName": "KinesisFirehoseexistingLoggingBuoses3KinesisFirehoseToS3375399AD", + "ExtendedS3DestinationConfiguration": { + "BucketARN": { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "Arn" + ] + }, + "BufferingHints": { + "IntervalInSeconds": 300, + "SizeInMBs": 5 + }, + "CloudWatchLoggingOptions": { + "Enabled": true, + "LogGroupName": { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5" + }, + "LogStreamName": { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstreamEC0EA660" + } + }, + "CompressionFormat": "GZIP", + "EncryptionConfiguration": { + "KMSEncryptionConfig": { + "AWSKMSKeyARN": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":kms:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":alias/aws/s3" + ] + ] + } + } + }, + "RoleARN": { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRole18870C08", + "Arn" + ] + } + } + } + }, + "testkinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole0D8588E2": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Events Rule To Kinesis Firehose Role" + } + }, + "testkinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicy88CA86C4": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "firehose:PutRecord", + "firehose:PutRecordBatch" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "testkinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicy88CA86C4", + "Roles": [ + { + "Ref": "testkinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole0D8588E2" + } + ] + } + }, + "testkinesisfirehoses3EventsRule05D717D1": { + "Type": "AWS::Events::Rule", + "Properties": { + "ScheduleExpression": "rate(5 minutes)", + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D", + "Arn" + ] + }, + "Id": "Target0", + "RoleArn": { + "Fn::GetAtt": [ + "testkinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole0D8588E2", + "Arn" + ] + } + } + ] + } + } + }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.ts new file mode 100644 index 000000000..ba4a2abfd --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.ts @@ -0,0 +1,43 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +/// !cdk-integ * +import { App, Stack, RemovalPolicy, Duration } from "aws-cdk-lib"; +import { EventbridgeToKinesisFirehoseToS3 } from "../lib"; +import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import * as events from 'aws-cdk-lib/aws-events'; +import * as defaults from '@aws-solutions-constructs/core'; + +const app = new App(); + +// Empty arguments +const stack = new Stack(app, generateIntegStackName(__filename)); +stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + +const logBucket = defaults.CreateScrapBucket(stack); + +new EventbridgeToKinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { + eventRuleProps: { + schedule: events.Schedule.rate(Duration.minutes(5)) + }, + bucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + serverAccessLogsBucket: logBucket, + }, + logGroupProps: { + removalPolicy: RemovalPolicy.DESTROY + } +}); + +defaults.suppressAutoDeleteHandlerWarnings(stack); +app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts index 3c6e09e30..7bcf603cf 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts @@ -66,9 +66,6 @@ export function createLoggingBucket(scope: Construct, // Extract the CfnBucket from the loggingBucket const loggingBucketResource = loggingBucket.node.findChild('Resource') as s3.CfnBucket; - // Remove the default LifecycleConfiguration for the Logging Bucket - loggingBucketResource.addPropertyDeletionOverride('LifecycleConfiguration.Rules'); - let _reason = "This S3 bucket is used as the access logging bucket for another bucket"; if (bucketId === 'CloudfrontLoggingBucket') { diff --git a/source/patterns/@aws-solutions-constructs/core/test/s3-bucket-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/s3-bucket-helper.test.ts index 81b07b03a..46c6dbbe8 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/s3-bucket-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/s3-bucket-helper.test.ts @@ -460,3 +460,23 @@ test('s3 bucket with logging turned off', () => { } }); }); + +test('Confirm Log Bucket lifecycle rules persist', () => { + const stack = new Stack(); + + defaults.buildS3Bucket(stack, { + loggingBucketProps: { + lifecycleRules: [ + { + expiration: Duration.days(365), + }], + } + }); + + const template = Template.fromStack(stack); + template.hasResource("AWS::S3::Bucket", { + Properties: { + LifecycleConfiguration: {} + } + }); +}); \ No newline at end of file From 387dec03e1a24bf34834cdabd17705c7fbf5dc74 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Sat, 3 Jun 2023 17:52:34 +0000 Subject: [PATCH 22/73] chore(release): 2.40.0 --- CHANGELOG.md | 7 +++++++ source/lerna.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95a754f43..65238123e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.40.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.39.0...v2.40.0) (2023-06-03) + + +### Bug Fixes + +* **aws-alb-fargate:** change container used to launch integ tests ([#962](https://github.com/awslabs/aws-solutions-constructs/issues/962)) ([30ba7d9](https://github.com/awslabs/aws-solutions-constructs/commit/30ba7d94a3cdd3766c24af49dbf66e56053b7b41)) + ## [2.39.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.38.0...v2.39.0) (2023-04-23) Built on CDK v2.76.0 diff --git a/source/lerna.json b/source/lerna.json index adddd0b92..3321dc620 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.39.0" + "version": "2.40.0" } From d14b4e3c35f04d769262bdff87cc22eedb894b96 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sat, 3 Jun 2023 13:56:51 -0400 Subject: [PATCH 23/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65238123e..aed35d27e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes +* **s3 buckets:** do not remove lifecycle rules from log buckets ([#969](https://github.com/awslabs/aws-solutions-constructs/issues/969)) + * **aws-alb-fargate:** change container used to launch integ tests ([#962](https://github.com/awslabs/aws-solutions-constructs/issues/962)) ([30ba7d9](https://github.com/awslabs/aws-solutions-constructs/commit/30ba7d94a3cdd3766c24af49dbf66e56053b7b41)) ## [2.39.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.38.0...v2.39.0) (2023-04-23) From 4cd3f8f55d8f52674c9f788bef1d832eb5b6734a Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sat, 3 Jun 2023 13:56:53 -0400 Subject: [PATCH 24/73] chore(version): Upgraded CDK --- deployment/v2/align-version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v2/align-version.js b/deployment/v2/align-version.js index 99068f430..09d2f8e82 100755 --- a/deployment/v2/align-version.js +++ b/deployment/v2/align-version.js @@ -10,7 +10,7 @@ const findVersion = process.argv[2]; const replaceVersion = process.argv[3]; // these versions need to be sourced from a config file -const awsCdkLibVersion = '2.81.0'; +const awsCdkLibVersion = '2.82.0'; const constructsVersion = '10.0.0'; const MODULE_EXEMPTIONS = new Set([ '@aws-cdk/cloudformation-diff', From 1649417403c03180a0f01e37c87a6eff40fbe4b9 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Tue, 6 Jun 2023 15:11:32 +0000 Subject: [PATCH 25/73] chore(release): 2.41.0 --- CHANGELOG.md | 2 ++ source/lerna.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aed35d27e..c8ef1a2e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.41.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.40.0...v2.41.0) (2023-06-06) + ## [2.40.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.39.0...v2.40.0) (2023-06-03) diff --git a/source/lerna.json b/source/lerna.json index 3321dc620..bb4ec9f4a 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.40.0" + "version": "2.41.0" } From fce37f485d342510ec63f2a1c816bd9645780f16 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Tue, 6 Jun 2023 11:15:04 -0400 Subject: [PATCH 26/73] Define CDK Versions --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8ef1a2e0..4177ec862 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,11 @@ All notable changes to this project will be documented in this file. See [standa ## [2.41.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.40.0...v2.41.0) (2023-06-06) +Build on CDK v2.82.0 + ## [2.40.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.39.0...v2.40.0) (2023-06-03) +Built on CDK v2.82.0 ### Bug Fixes From 09465d65fc5969da5691cf5057c278ded8753b43 Mon Sep 17 00:00:00 2001 From: George Bearden Date: Wed, 26 Jul 2023 14:08:42 -0400 Subject: [PATCH 27/73] feat(new construct): aws-openapigateway-lambda (#912) * README for new openapi-based apigatway-to-lambda construct. * fix(core) prevent lambda id conflict with multiple buildLambdaFunction() calls in the same stack (#910) * chore(release): 2.33.0 * chore(release prep): Update CHANGELOG.md and align-version.js * Freeze @types/node version in cdk-integ * Freeze @types/node version in cdk-integ * Update step functions integ tests * chore(core): Add warnings about using core functions from outside of Solutions Constructs (#917) * Add file header warning * Add function header comments * Use latest CDK to address .NET version issue * Fix 2 typos * One last typo * fix(StepFunctions): Address LogGroup behavior problems (#922) * Implementation * Clean up some code cruft * Update package.json * chore(release): 2.34.0 * chore(release-prep): Updated CHANGELOG.md and align-version.js * chore(release-prep): align-version.js * chore(core): migrate to assertions (#929) * First two test updates * chore(core): migrate to assertions * Remove old lib, final few modules * Update the cloudfront-to-s3 construct to correctly set the logging bucket property. (#930) * Update README * Update openapigateway-to-lambda README * Update README/architecture for openapigateway-to-lambda. * Add openapigateway-to-lambda code and initial tests * update openapigateway-to-lambda package.json dependency versions. * Update openapigateway-to-lambda * Update openapigateway README * don't depend on NodeJsFunction docker env * Update openapigateway-to-lambda README to reflect actual construct API. * temp commit * Update snapshot test for openapigateway-to-lambda construct. * fix package.json version field * update snapshot * update openapigateway-to-lambda custom resource to suppress standard cfn nag warnings. * [wip] resources project * fix dependency self reference on new resources module * fix dependency self reference on new resources module * Add integ test to the template writer resource. * Add integ tests to template-writer resource. * Update template-writer resource integ tests to clean up test buckets automatically * Add additinal tests to get 100% coverage on aws-openapigateway-lambda * Add additional integration tests to template resource writer and aws-openapigateway-lambda. * remove eslintignore line that was obsolete * cleanup eslint ignore and update openapigateway-to-lambda props. * Update python/java code samples for openapigateway-to-lambda. * Update openapigateway-to-lambda README * Update resources README * Update resources integ test * update resources integ test snapshot * Update integ test snapshots for aws-openapigateway-lambda. * Update aws-openapigateway-lambda construct to trigger api deployments anytime the incoming api template changes or any time the lambda functions change. * Add new integ test for cognito authorizer on aws-openapigateway-lambda construct. * address minor pr feedback. * Remove integration tests that use BucketDeployment as the asset hash of the AwsCliLayer changes outside our control. * Remove integration tests that use BucketDeployment as the asset hash of the AwsCliLayer changes outside our control. * Address pr feedback. Add new template writer integration test for transforming large template with several thousand substitutions Several new comments/documentation to make the obscure less so, hopefully> * Add additional tests to aws-openapigateway-lambda construct. * Update integ tests after latest cdk lib update. * Add optional construct id parameter to the buildLambdaFunction function. * Update aws-openapigateway-lambda property descriptions to better explain optional custom resource values. --------- Co-authored-by: Andriy Co-authored-by: AWS Solutions Constructs Automation Co-authored-by: biffgaut Co-authored-by: biffgaut <78155736+biffgaut@users.noreply.github.com> --- .../aws-openapigateway-lambda/.eslintignore | 4 + .../aws-openapigateway-lambda/.gitignore | 15 + .../aws-openapigateway-lambda/.npmignore | 21 + .../aws-openapigateway-lambda/README.md | 221 + .../architecture.png | Bin 0 -> 33441 bytes .../aws-openapigateway-lambda/lib/index.ts | 228 + .../aws-openapigateway-lambda/package.json | 104 + ...AssetExistingLambdaFunctions.expected.json | 1013 + ...teg.apiFromAssetExistingLambdaFunctions.ts | 61 + ...iFromAssetNewLambdaFunctions.expected.json | 1012 + .../integ.apiFromAssetNewLambdaFunctions.ts | 52 + ....apiFromAssetWithCognitoAuth.expected.json | 1012 + .../test/integ.apiFromAssetWithCognitoAuth.ts | 52 + .../test/messages-lambda/index.mjs | 16 + .../apiDefinition-withCognitoAuth.yaml | 50 + .../test/openapi/apiDefinition.yaml | 39 + .../test/photos-lambda/index.mjs | 16 + .../test/test.openapigateway-lambda.test.ts | 321 + .../core/lib/apigateway-defaults.ts | 19 + .../core/lib/apigateway-helper.ts | 37 +- .../core/lib/lambda-helper.ts | 17 +- .../core/test/lambda-helper.test.ts | 76 + .../core/test/test-helper.ts | 30 +- .../resources/.eslintignore | 5 + .../resources/.gitignore | 17 + .../resources/.npmignore | 21 + .../resources/README.md | 21 + .../resources/index.ts | 14 + .../resources/lib/placeholder | 3 + .../template-writer-custom-resource/index.mjs | 73 + .../resources/lib/template-writer.ts | 179 + .../resources/package.json | 82 + ...g.template-writer-from-asset.expected.json | 431 + .../test/integ.template-writer-from-asset.ts | 41 + ...late-writer-from-large-asset.expected.json | 433 + .../integ.template-writer-from-large-asset.ts | 66 + .../test/integ.template-writer.expected.json | 432 + .../resources/test/template-writer.test.ts | 82 + .../test/template/large-sample-template | 25599 ++++++++++++++++ .../resources/test/template/sample-template | 2 + 40 files changed, 31905 insertions(+), 12 deletions(-) create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.eslintignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.gitignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.npmignore create mode 100755 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/architecture.png create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/package.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/messages-lambda/index.mjs create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/openapi/apiDefinition-withCognitoAuth.yaml create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/openapi/apiDefinition.yaml create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/photos-lambda/index.mjs create mode 100644 source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts create mode 100644 source/patterns/@aws-solutions-constructs/resources/.eslintignore create mode 100644 source/patterns/@aws-solutions-constructs/resources/.gitignore create mode 100644 source/patterns/@aws-solutions-constructs/resources/.npmignore create mode 100644 source/patterns/@aws-solutions-constructs/resources/README.md create mode 100644 source/patterns/@aws-solutions-constructs/resources/index.ts create mode 100644 source/patterns/@aws-solutions-constructs/resources/lib/placeholder create mode 100644 source/patterns/@aws-solutions-constructs/resources/lib/template-writer-custom-resource/index.mjs create mode 100644 source/patterns/@aws-solutions-constructs/resources/lib/template-writer.ts create mode 100644 source/patterns/@aws-solutions-constructs/resources/package.json create mode 100644 source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.ts create mode 100644 source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.ts create mode 100644 source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/resources/test/template-writer.test.ts create mode 100644 source/patterns/@aws-solutions-constructs/resources/test/template/large-sample-template create mode 100644 source/patterns/@aws-solutions-constructs/resources/test/template/sample-template diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.eslintignore b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.eslintignore new file mode 100644 index 000000000..910cb0513 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.eslintignore @@ -0,0 +1,4 @@ +lib/*.js +test/*.js +*.d.ts +coverage \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.gitignore b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.gitignore new file mode 100644 index 000000000..6773cabd2 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.gitignore @@ -0,0 +1,15 @@ +lib/*.js +test/*.js +*.js.map +*.d.ts +node_modules +*.generated.ts +dist +.jsii + +.LAST_BUILD +.nyc_output +coverage +.nycrc +.LAST_PACKAGE +*.snk \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.npmignore b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.npmignore new file mode 100644 index 000000000..f66791629 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/.npmignore @@ -0,0 +1,21 @@ +# Exclude typescript source and config +*.ts +tsconfig.json +coverage +.nyc_output +*.tgz +*.snk +*.tsbuildinfo + +# Include javascript files and typescript declarations +!*.js +!*.d.ts + +# Exclude jsii outdir +dist + +# Include .jsii +!.jsii + +# Include .jsii +!.jsii \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md new file mode 100755 index 000000000..df299b0b3 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md @@ -0,0 +1,221 @@ +# aws-openapigateway-lambda module + + +--- + +![Stability: Experimental](https://img.shields.io/badge/stability-Experimental-important.svg?style=for-the-badge) + +--- + + +| **Reference Documentation**:| https://docs.aws.amazon.com/solutions/latest/constructs/| +|:-------------|:-------------| +
+ +| **Language** | **Package** | +|:-------------|-----------------| +|![Python Logo](https://docs.aws.amazon.com/cdk/api/latest/img/python32.png) Python|`aws_solutions_constructs.aws_openapigateway_lambda`| +|![Typescript Logo](https://docs.aws.amazon.com/cdk/api/latest/img/typescript32.png) Typescript|`@aws-solutions-constructs/aws-openapigateway-lambda`| +|![Java Logo](https://docs.aws.amazon.com/cdk/api/latest/img/java32.png) Java|`software.amazon.awsconstructs.services.openapigatewaylambda`| + +## Overview + +This AWS Solutions Construct implements an Amazon API Gateway REST API defined by an OpenAPI specificiation file connected to an AWS Lambda function. + +Here is a minimal deployable pattern definition: + +Typescript +``` typescript +import { Stack, StackProps } from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +import { OpenApiApiGatewayToLambda } from './construct'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import * as path from 'path'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; + +const apiDefinitionAsset = new Asset(this, 'ApiDefinitionAsset', { + path: path.join(__dirname, 'openapispec.yaml') +}); + +new OpenApiGatewayToLambda(this, 'OpenApiGatewayToLambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + } + ] +}); +``` + +Python +``` python +from aws_solutions_constructs.aws_openapigateway_lambda import ApiGatewayToLambda +from aws_cdk import ( + Stack +) + +import aws_cdk.aws_s3_assets as s3_assets +import aws_cdk.aws_lambda as lambda_ +from constructs import Construct +from .api_definition import ApiDefinition + +api_definition_asset = s3_assets.Asset(self, "ApiDefinitionAsset", + path="openapispec.yaml" +) + +api_integration = ApiDefinition("MessagesHandler", ( + runtime=lambda_.Runtime.NODEJS_18_X, + handler="index.handler", + code=lambda_.Code.from_inline("exports.handler = handler.toString()") +)) + +ApiGatewayToLambda(self, "OpenApiGatewayToLambda", + api_definition_asset = api_definition_asset, + api_integrations = [ api_integration] +) +``` + +Java +``` java +import software.amazon.awscdk.services.lambda.Code; +import software.amazon.awscdk.services.lambda.FunctionProps; +import software.amazon.awscdk.services.s3.assets.Asset; +import software.amazon.awscdk.services.s3.assets.AssetProps; +import software.amazon.awsconstructs.services.openapigatewaylambda.ApiIntegration; +import software.amazon.awsconstructs.services.openapigatewaylambda.OpenApiGatewayToLambda; +import software.amazon.awsconstructs.services.openapigatewaylambda.OpenApiGatewayToLambdaProps; +import software.constructs.Construct; +import software.amazon.awscdk.Stack; +import software.amazon.awscdk.StackProps; + +import java.util.Collections; + +import static software.amazon.awscdk.services.lambda.Runtime.NODEJS_18_X; + +final Asset apiDefintionAsset = new Asset(this, "ApiDefinition", AssetProps.builder().path("openapispec.yaml").build()); + +final ApiIntegration apiIntegration = ApiIntegration.builder() + .id("MessagesHandler") + .lambdaFunctionProps(new FunctionProps.Builder() + .runtime(NODEJS_18_X) + .code(Code.fromAsset("lambda")) + .handler("index.handler") + .build()) + .build(); + +new OpenApiGatewayToLambda(this, "OpenApiGatewayToLambda", OpenApiGatewayToLambdaProps.builder() + .apiDefinitionAsset(apiDefintionAsset) + .apiIntegrations(Collections.singletonList(apiIntegration)) + .build()); +``` + +## Pattern Construct Props + +| **Name** | **Type** | **Description** | +|:-------------|:----------------|-----------------| +|apiGatewayProps?|[`apigateway.RestApiBaseProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.RestApiBaseProps.html)|Optional user-provided props to override the default props for the API.| +|apiDefinitionBucket?|[`s3.IBucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.IBucket.html)|S3 Bucket where the OpenAPI spec file is located. When specifying this property, `apiDefinitionKey` must also be specified.| +|apiDefinitionKey?|`string`|S3 Object name of the OpenAPI spec file. When specifying this property, `apiDefinitionBucket` must also be specified.| +|apiDefinitionAsset?|[`aws_s3_assets.Asset`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_assets.Asset.html)|Local file asset of the OpenAPI spec file.| +|apiIntegrations|`ApiIntegration[]`|One or more key-value pairs that contain an id for the api integration and either an existing lambda function or an instance of the LambdaProps. Please see the `Overview of how the OpenAPI file transformation works` section below for more usage details.| +|logGroupProps?|[`logs.LogGroupProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_logs.LogGroupProps.html)|User provided props to override the default props for for the CloudWatchLogs LogGroup.| + +## Pattern Properties + +| **Name** | **Type** | **Description** | +|:-------------|:----------------|-----------------| +|apiLambdaFunctions|`ApiLambdaFunction[]`|Returns an array of ApiLambdaFunction objects, where each has an `id` of the `apiIntegration` and the corresponding `lambda.Function` that it maps to.| +|apiGateway|[`api.SpecRestApi`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.SpecRestApi.html)|Returns an instance of the API Gateway REST API created by the pattern.| +|apiGatewayCloudWatchRole?|[`iam.Role`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.Role.html)|Returns an instance of the iam.Role created by the construct for API Gateway for CloudWatch access.| +|apiGatewayLogGroup|[`logs.LogGroup`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_logs.LogGroup.html)|Returns an instance of the LogGroup created by the construct for API Gateway access logging to CloudWatch.| + +## Overview of how the OpenAPI file transformation works +This construct automatically transforms an incoming OpenAPI Definition (residing locally or in S3) by auto-populating the `uri` fields of the `x-amazon-apigateway-integration` integrations with the resolved value of the backing lambda functions. It does so by allowing the user to specify the `apiIntegrations` property and then correlates it with the api definition. + +Looking at an example - a user creates an instantiation of `apiIntegrations` that specifies one integration named `MessagesHandler` that passes in a set of `lambda.FunctionProps` and a second integration named `PhotosHandler` that passes in an existing `lambda.Function`: + +```typescript +const apiIntegrations: ApiIntegration[] = [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + }, + { + id: 'PhotosHandler', + existingLambdaObj: new lambda.Function(this, 'PhotosLambda', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/photos-lambda`), + }) + } +] +``` + +And a corresponding api definition with `GET` and `POST` methods on a `/messages` resource and a `GET` method on a `/photos` resource. + +``` +openapi: "3.0.1" +info: + title: "api" + version: "2023-02-20T20:46:08Z" +paths: + /messages: + get: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: MessagesHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + post: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: MessagesHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + /photos: + get: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: PhotosHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" +``` + +When the construct is created or updated, it will overwrite the `MessagesHandler` string with the fully resolved lambda proxy uri of the `MessagesHandlerLambdaFunction`, e.g., `arn:${Aws.PARTITION}:apigateway:${Aws.REGION}:lambda:path/2015-03-31/functions/${messagesLambda.functionArn}/invocations`, and similarly for the `PhotosHandler` string and `PhotosHandlerLambdaFunction`, resulting in a valid OpenAPI spec file that is then passed to the `SpecRestApi` construct. + +For more information on specifying an API with OpenAPI, please see the [OpenAPI Specification](https://spec.openapis.org/oas/latest.html) + +## ApiIntegration Details +This construct defines a custom type, `ApiIntegration`, that is specified as a required prop. The type has a required property, `id`, and two optional properties `existingLambdaObj` and `lambdaFunctionProps`. The `id` property is used to map the corresponding lambda function being defined with the placeholder string in the OpenAPI template file, and is not a CDK construct ID. Exactly one of `existingLambdaObj` or `lambdaFunctionProps` must be specified or the construct will throw an error. + +## Default settings + +Out of the box implementation of the Construct without any override will set the following defaults: + +### Amazon API Gateway +* Deploy an edge-optimized API endpoint +* Enable CloudWatch logging for API Gateway +* Configure least privilege access IAM role for API Gateway +* Enable X-Ray Tracing + +### AWS Lambda Function +* Configure limited privilege access IAM roles for Lambda functions +* Enable reusing connections with Keep-Alive for NodeJs Lambda functions +* Enable X-Ray Tracing +* Set Environment Variables + * AWS_NODEJS_CONNECTION_REUSE_ENABLED (for Node 10.x and higher functions) + +## Architecture +![Architecture Diagram](architecture.png) + +*** +© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/architecture.png b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8e0352b5060fbf4a318d9ca84cd5166ae76817 GIT binary patch literal 33441 zcmd43c{r5e+dpinD3zVczC{cwN!CFlA$#_%vPNjJGsc=N6rmJTBiWKIJ2MgyF~+`+ zC5&|}V;g4Xy`}H(_dNBy@9%y8dyiur9mhR$pVxVv=jZ&K%YEI&80cx9I&tm<6&2Mf zt(y=dDk^Fc@b`@V7;vSlG;j&{hx&<;raINRqDLrF%ryD*NMV-m&mg(Hwjx z)cL(M;Dv$N3(5Re+p>IO^x$BJ!|ygE$D)X89l6iiR1Q(BdSzK&MAg= zv5^vEJq2P03q4Q5Um$`k=Xk`m_V0(zvEF86A}ioeu+bmN&ro#%gf!z>Fc&p@*c^}9 zBwbV%%ODwIyplfL_h^5*N|&u;Aa^(Lh${XQl|S*jSjl z8r8wdt}OJ17-`ddSx1AQ)#1D6iA=%!E5LQ&vv53gA|@M5rE>Zb#w-#X4d>s#8~^2S zE2o}PL9p1*gy!ynb_1MgjWF2}76%DnqM|U$ zqY70Jp~7r)R+?a<-eB#fZZiJfmVpjUyfFcM;im8jz8fZ2o(nJBJW-fG=`*lJb4KgL z^2dvg5{7-^l@dq3_*ME%VqZinTwA$LaNErlJbSoR)RA*=TmM~)sH2f*rGP(yQM%tIrDvvLf|ezO;odMeLJzfM5}?A!EsFi0 ze$+Jxfe+v|PWy9jb-nW=QIvhtDk@M7XVr$Z!&!*LQPiu}IT>-tk;7#`q2C3Fpiz@a zhJ5!lH%ATtX?@Nloi?wUYj>aO+t6aRkFyGf{*H$unX1!Fq{KLO&X*%M^SN<8(oo-@ z<%NM3JFF)w!C7i+w7RwQ2+vr0=0A9Ps%pU5r%Pc_i+u5pPOfK9AG{`M8y)yP# zbD$#2z!2@{k!^8~Eo>BSpdorh^hQ|`8>7rnrMSu zB{K681S{GUedM?QnEYtsbqR&|db~K%)QMEPanW3tZ^xNR@nQm|&dO?97@Iv@fjXWa+`|QlhAyxDm9|*HMk9d)QY{1lP5=tQDhZ@nSy?Ydc zEGXbX@I^bH@DKYf{NU$SgzPrGk8cP;MoMql0$MPzhxmaW&9i+pzio3-sH+u%+TloY z$!3i$O}Uw_7e0l3!k|48nK-S;IQs&pU2~0WBU7BP_qR7ih{GS0YzwgO&zbu62X=G> zUHftM92>U9C{6Wm#G|>(CB27?d`|#zfzssews%Jd{|#|gsL4)WmQNHwVKD|idV_pOFe)q|xIOy(ehfdc{6&+#GZ_MetEsX5LRd0)JiN^`sdan#5$zbs#7HyA#ZUIDsJLKW zsgTXv+h=f7FTj6ps$!wn#SB#R%w(*wsORfU4m0Mhs5>5T?z{KQz*lp&UDk6;vyAMM zb{gSRp7&iCnTBZ(fv9jq-HedYNV!#x-`h-tGG73KPdIcj<}kld(WnVA4I_%|?F&%( zkKeU#Z@g3UX5;4Ax?scIGERTwaDPnn3ZYL0h-xj-Cl2u&qDm5_!W2=U5$6su7ZM_Q zgr8V(2Xg+w05*uQgnVa?v+-|UBQ({f(rBJ zJzgg69{F;&mHRg_^LriNkst;Ij6Q*QB~yPD5Im;^;aZ^5ImgVyG&6bwB5}%bg&(o< zbP*nd!$JskOcO?e#PH~vs@~)xnD6e0ieNx`bf$=4^9LK+XqU3+Z?x}~Ap~}2Qit%^ zQOK8==vfww5X6gzSymLm3DgJCdQ2EOh?ft~Lk;G`{hoRrf#48FZMrukBnAHXX?I=-i{s z%32Us-QlL)L;=KW^#(rnamLwcNiPvW4@SP`HyRL%5TdL}D|+eZgj$r!4*f+_hr|5W z#dLf}h?v97Y=!0?Oo86sr*I3VLm;3EMkb7cAn|SVRE$`7G*TF`7mbq^bQSz$xpnfP zpZ*6&-<>GPmz3!A7%#3E+$BL`PZu*q^w_xvC1vj_FPW2TveDzwf`SWL5OAzQ*{k#z zl>tSYmwnp3Y0~nj%Z!`6q6@7`Rpd$*jFI554#YktnsIcp;;|w{4YE{frw);3G4vF) zya_4LIGcRb%%W*Vt)mEXMZ0(2N3aGSt;fk564e~?UYfZ>RB*O=St&f4d>ukrpJcs$ zJ?J~;{2>_C8u&1CWm8xIL5}QOw3xW)=K5khibf` zJ5?V+KkmjPwk7y7?u$MXa~u~P$F7Z_G)I+xqmixfN^Pu4ZTkQVh7<8X0)e(z*xeLD zw8ymC)T2ZYLx|6A5t^Z3@IF5zBhvS2E+6A7^J4j8E;z-`7hk4<-rbnE%g#Ke1z|t7 zP3}`~m6xoX3wpsAXy!NZZJg#b@lG@aPIpo1x!Pf^;_~6hJ~On!b?CC=VqkhGAH(2X z!Fw;91?(|%6z3OC?WvK`&Clqlu*`;5g7=E3tXW1Om>o;r zWJG2ze#LeT#mWUM4rrurOf)z?u2M4}Hr1d&FGWv!E_ep!`hIyO*T5U^ASllCgvwe2 z?te*cOycn==9!wH9=V!r8`L~ZSS4#!;5t0!>rq(1#4Z&dJ!USHeIOiM`EbnNqhTzb zAg@_=SkyIbPYs8i(S{6pAhXMkq8q<);4TUfmzb-x*_yBg7S9Gxk?NxwclWO9f1FnG zyT?tJsp`CcjFNojHi#AG%skT-6YawVda`wG^_ibkoTSaxi7Vx}@wuR(f(BYns422G zf1^p6!%PMKjwdBor;y5{BEL3Z>JnyBuP6bk+IDn!Quu`^BbSGgiF}sQO+Aj$_AQbvGy;5Z`}H_DBT^v0_D9`9QSr?Z@=RW zE#nctiux7pZ8O4d@{z!!eyUIM#KJ{q>p`=}R=KGM0-n4XFV`Y$YQ@%ZC#9V$tyH%w zZDAGJ?V++OYu%U#1t+gs(Ka1zGOb}Wl5lwlj9mC z11z-4A0c=8Ui;{opb|p-nuYbQOylD;@gfcd~8wa`Q%LC{@E~5#q|%$ z&>sSfFa4f^(Yjp&^JOhzsGcVi)l5nu-5T&k^hy9Ur1=rSpN0t0mWmr%&!?LGu{n1< zl>U%H<6i<43S_3rAkC6136XEoMjv$ny%5GNQnsyZ$j0|=oB$&Ap3obE;STAp&Dni_ zGPORv7w6!UZcC8;ubAh5#PCnN01^p4k17kdQRDTWj7Am8&rJUXS7sFu_V8<2dE$T4 zAwQEaO(+M6UzVZyPiCW{uVT3vtD^5`-@bn*`p#v=l+T~jza}pX#~qI&YDW&I+Klv^ z@MjT%?aj&V`TUHTsHS-<>RB3bD6vbG9*01OeN`M@Bd_Sk#6R*ozZ>b@)w$6`^tCna zbZd`SvxBWzp0ZtUi5kX@^slRID*1P%^(-wtV8K6Z$vL?YD#tpN?M3vdtQ$?3j)=?l zR+=8qc%GhN+S-0>lQx7r|B;#)K#^!(2p#@{@yq8cLQb$U_&+`mXNmr!0@Z;Ebd{@5 zuLh|ypxJ!KPDwx4?bCp#rLA3-v9GfD^lh$uyUtpdv5qEW`)HSb_B4sIXi4zbRI`oE zfd{oT7J6#_$4H^g3dYR6tg$`FOD5XY3mVl!Y-JDU1c+2yL*01ZGHtYL!rL%_R7z4y4SRP zZeX^(0{DtZzNa$v3KTU@M%Z$?J4(|Oy&ni)iJUkU=2ymjI*6C5sAbMCh`R`>mx*SZ zD5Jf$I)3c?MEm{7r5|@N&iX%tOLPQ0$DbtbaDU@a@l0y6!aqi>*^;eA$BUzsuW~2S zX>*TmGD_!M$y{jJy=3h4%}Q_sN&g350(v1w;Wkx4)`h_j6XYkW z8Gjh%n>RhSFn9uL{NR22n+{wH(w2X8xGob;cl^QTI%R_@q^Hclzl`874VymxsBR9- zkS@B7MA~O8&O<@ZzE3QFQ5gRQZ|@67?#2gqSkWzx({b2;X61YQjmGoj&y5=btxBzT z@sXEy9$N~)pSK{;p=0~puek6xT0i?`1;X(%`s3eUEw+S9s^muRg*A`bP#&s$Hzt`c z`7hq}U}dDgcIrF zbl~6~|C(Sk2C4uBDS3u~c~-Z|m6*Efk2)dnv9AkVRAL8`aT_7u#^#|*6;AjF-ntCa z7OSCB+(ttvsslFvu?Wu^E6#_^&49?DEdkj{i5gzB`~2X!R_WJTw&)(bw3+ zJe8=Be^_+_%JXrxhjo}DJm$+x+7PZM_m77(hmQ?Cpx*eP;sagOnc1l&>of|^(0co+ zbHPsEQJeDI1u5)jywV?-RvJ{8Js#q;0xdwG`o96_IX{3tI^pB5SeSqZ22CVmx)yu= zBY}K=o79zYsBjssEsxdrYDys!eat@-M0IM8l>s#T4gu?NPWbr@HG>j$TINE{m*s?t zPClvz@TA7T2-b&kN^?4=zd235i>6{gE?OVkcRlQ;)n8J@A(2XPsGhPn=A2Mp z-Kh@yL7HFkR7Bqg9G6vO6EzZ1i)9TN(kvT~ulm?+_y%#Xll6Xviq5QI{rf3%|1HR#;GiWn`=27Z8E9SAzqQdcW_g<5(@tSKL}eDO-eF6Z(4q!r88oJ>{<<}t7rg%?3@9lFr;f+f z4bxB`@@ms@Tyn)=A$n!Y^jKWCRgYig)yz#a_M^oh`*nxTNB*Mfq>UKl9VG=?(dp1iG6t}p$XliPBvGNQNAq^Id-S`9-FGiDwGF`nV*YGQ@=ZZj z{<~L}EE6d#`~H#F6)({jIGQFn)Dc7I7?tM2%&zhO8HP~Ne6Qd3Pv)-ZqV!M=_q|GQ z=vVS&`-1sa+BjT1p_NoeM_a_9`lpEIKk~56mUjN;724mMr#kYJUX{>6KdJJkjl9AH z^p(fDU$`9mbKwuee|p=CLcqvHC}QtVp9&;wRRY&dO~lzh z7w+5u`qCTp+lR%l>bp>;5S-le1c=NbXjB`X0mI8@On+uIA*!^%AkCAXC&uYds~mFn zVEXo-$s1MZF`&=Isw%K_{Fz`<%K)<=8TG2e7^0#%6+s0-g?b66Q~zm%odAWMA|C#x zwF73O2gafQzcYZ=&9a5bAStC`bfglyecgxiL#*G^ycG^j| zQ&Ljcd9`_BYW_1jIIs}ESBLCCgxT%eZ`smPNziUg? zE|tD=>PY8dPs=U^wWR;Gdq8#tARA)Mo8l-h_4mqZVlpx^dWJ9WJ+csNe_Z#M={f6V z{Z=P-qNAe)A6bCfAFGRb3oo4bFW?I6TAlpHDj^}k(B$|Y)UM^U`oF-Y9zzAOBlLH@ zznUs(FUlBGtHK;(tYR#KGtqSNJuYF6RaW!p)KvakP5 zek4~mKT}1)&2#eI7 zpZ_dh@VQ2OxhaN~ZpX;*C91Tn%qq%A6Y=@K5Cq-}Uunwbh^kWJZ-2}s^7MbWS^3dalkMa7d>9M zuFku6@76ZW@RfpmkN;~wCBKJh0KBlffO%|&hK6kZM;CmKMeLuKf~7fDTm6GTgMfel zIjtn0*mkUg#fry2!E@^Dg5jQeM3H zDoBZ|+BZp^>G?PMo}T6jurxOxL{F`ATBPdB{Y4yz%BQEed;&~N`t+yPoh?!WBmOcW z;Qq2!PtG*(kJ8bezw8e# z{QP`9;9ha5Nr4Z!W(n}2No z`t|EMiP-h(s(tm;8S4Kb@Mwj#hJU8*dzzZ|NB*Tfc77c7EbP87rhvz%GJP;1tK*slWGp^gY07aezh4t%C*I*ZKe5c3CS-SPGo# zxSRC%y?|sLKxr{4aFXLL{x6*m$)3W?!LcP^CmvgR39xwg-x7YWt^=%IRJCuAI@A6) zWA@a;UJGmSMYmJhN`w6W2cypbbi%ch)C`u8SUmBs?so6R+5#R`tEJ9-{l769KCXSU z6vTMxpFr*I>500T^hM7aDc!!_^|#`{*5Ah>98%BE2K?tNKwP_bDJbV}$L9pXHEcQ3 zNxZ+eDhAjI4bvcmwta7BMpjNUe2u5*v7O;cyM{^n-iSl~OismJl4cDa9x zBFYU7L({nSzETjD?eA5M37TTD>-kkd0Oh~=+fKMb0)g;GM9Z={ElIdODJ4br@;|JY z4F(iWYn~CeNcH^NR*1^WmoJyh> z*LwV%KA_k^WQa^X&I7gE|2MU=_0LH{sY=!PX9diOrhe6N3>ePaK%ln(f&L1JLCXXG z_5Vls=hWc&IkprL{?GEY7s#NrOpY%@Uh)BBNegoBMwh!Zv8 zE~fVPGZ&4N?TWq`1sX!OZ;h-^KQ1^;xhd+4obx&UzG(Br?YhAjCMXPM$OKipC?piF z5&XW&8lZJQ*rcHHK`~s#3B{)7zLs>1Lp~9W6!9wNdAvKUllK_^F`)7bU=NttbppUY zYXIK(NB0=YN=sMP`J^BJ?gB-r$sg@5CrUyCA>frsd+M)NuQ$%76xRQ&2pAr+eb6~= zmj>LNN*;p{-c|+KrUC=@>v6rm{gx3TPJANd{*6U0PrYMtXHI5*a88EQSveGv*Xz}A zTNYj_n`Y?Pc^!+5uS&l;7z%r1Hn$ zeW7$**#zInPXyi$Y2-lDoG_wgRCYw+by-ZCZEY`aS_FKvd!%_e61TTq5QbCKpxA09 zWlkQ}AAA4NZ9XO3Irl`$mFS)6G)6o zmo9qjpO(#<27msz9^iHIcqL~l5(XW`LBK*n(;R{|VoFLu-)r&6TC0}dvcY!N($5`t zgGsz`q#wzmLt}6t=1wt&z|h=A;i_38?_z>qx-aX$vi>~l{a^z$0)cPDwfVhBKjDUQ zn9RFv@};FhVK14vk`sYvRGa?zojk*8lqUmF!IFPQdwb1JPEHP1TC2Nflu0XT*4fcf z`CVMSuoj3AGdVe#@r*X|x$6~i1{!`QFB%XrvJCOS$_#!@gOwDk`(PejDv2$Q*kXgF z6>q`Jbsa6T7Mg3I2OdMURADTL&m;f{*C51tPU37+h3}^!#1c2KY#NisR8$sGw;6i@<{L+L*sDeC74}8w|54G z4zo=e=n>PfGheM0(bB%i|4X23#do^7D53uHkPs&`GX^teO+~4tk_RAug#%FgsLW7z zr6wWy<3cJKB#yn(QxQ}hJXsiExX)u(VDlts#8rHz=ev8pulvU2R%7=zexO@S0~=nB zfAK+Bt9YFh*!le25mnU6=oN@*L?fEC`s4E!fuLBTl zX3%C(x>sF@`A&x8>IrI6>qreHZG-`{jpyuh(ZHIy@tGoFjAx91(=}DB(7@bYHfZ3w z>?{k|sBCMfO*&|$_nqY)6O^)7X&8rmUCtTTnX_fyF+V{dvX zb&>gv+zQC+6`)~V1>2izLUPwWkxKQKDbFSrWg3?wv+)v=+iT~_ac?a44)$Jku=jTg z)IRvRj_8t8I&EK!bo|#E-ud<2(Yb%^@xCNiZcOnOL#A@adc)Vpp}Z^)0|kg=%mV@f z|6@2R1&(5q1qTD0p%+1BBNu4|kK6i_ZqW8ENi3qcX?RCMuQAo+R zw0w=19be8`8wgPf);=DwYSdJfW@1N;*?JH}ZP6 zg$^gIzmxKz)z4%#&h&JJ5}&kxqcmIUV5T_3w!zo19?6_adomvcOTn^1;L+BF2U5W1 zt-w68p*|btXE_$9qQ8(>>v~pWtJ<*e_M~>jmfV}u9M9sY1^43lw?GfY{O9!Y2Wy6n z0u&)&?_(fdz1N#AoXuc`CI!{?CvE(|ERa>FwYlo<*LiWMpi|GHrmEv3RzY>cu%k0TPx$SY6h2q zMRC;n>~`_narlwnLKwk%3>Y~k2RFEMNedE{$leVA(2s>Qn)ekrM`^s@r*lEud{1+5 zSi0EffydIjA8ax%rNeb$?BVk}@HdN}%B(sgaC;0~2)wk~VeaKSUK|Mab$y#yLdzkYt=kP@+ZqZ(9Thbr{>yt{a>jvI;*-^zK~)9=|j}-tbZqz zDvtd1!Z95?tT@(~m%0Y7+!Ku0DsL{A`&nG0Sj<9Uc z$wyDP*i(_HBQJOl3Y8#XfHkc%eg-7EjKvA+b7^PWNeO1xnKW0e1`(=nPC|4n_ zaVyk3s>t@S z#^$5%eqzVVxf?HyZxopolJa8(6_kqTOn4+pubhcNztX%k7jJCUxm$qUT2}s5bR+nF znZSWWAYH2o{LalgI;!j>&8hMSz3lGCD3$R8FLH8>yLH{T`#J(2FRCj1y8^O1 z0M{$FotU5tS=bz>4C#lr7tdJjwY%z7xpnpj&r#ntv4uos;@*?pM1*b2A`p9Si{vMB zYoj6D5(@HoS#T$IXv{b`Xb~!5unaX@qI3!tqWPQ49I-Mt46`{_4U+K zA{;RL=%p8WKN^J$N*|qGgPGD49dX$$c3Mtzx40hZX=!!*PBtiEBtQxTE%<3Yef_^% zmBdJAN_c~<)+=APSWN`+s7tPptP6P<$S<<5yY+tQ`v4bH%FA$_nd@AJ4J-Ts~{yhU!p?MkXevx3~bNJ$_jB?A!!s~`Z8F8SpSOLqEZO(u;Ar`w>r&y zo#(T}_yT;WGOn%Km#=4`xz)4=Kt>eP)md}#y?%MlhK-*}&LqFmI|W*nnGcpZ>n>fr zv+O2QM2{svgZh;;3Z7u*qQ=n*a>QRr!hQZI*#I0B70p$qiES)0=9muFo2M2&a6xFm z=r&_VI`~?SXvRHZf`%yh@%4&9K)mX zlT9sZ{7yEUd+LVugB00Cz4%N)>HGrD!wCRrR##1}xIZNY@-P`~QE1ab`dre0U$9<% z(rG|P`#sCUo`}7vMd|%Siapx##bRe6@HG})*A`;Nl`FmEN|_4wR(Zji(6_h!!~lXK ztba|2GK4)PY-UvT2ODSlH3bzT$HBMN{NEr9nCPj2j2g&y;u%iVuJYBrh+>ND-bsZY zGV_rld@p)4yU)APh8giP)u~i`cT%`-Twx3`QWS?{h55r-rul`s7I(u_V7(;K1=61U zH3V#E;?Aa4YZ}*vU34&g-H4$E)58Pc)9qSIhc|yJc<-S#Fr^?^ouSq{U_@TDf6Gzb zD!p4H!uDi#)3yGK+E?3eH35-RQrwy`ub<@Z&wsQWTLz!4R7gJd3f4>8B0&7CuL35B zq}je#A+TtDIOA|;U{>iKc+>#TCtimK+Ky4yiEX=1+V3$zThF!cN>D%@P}rT+huB(& zjulG3aYQ+#<6N7)8E-A?-M#UKO1D&5ssH~4z@+bU7|QD&}Fcqx}~+KyrH#e%dgcP!H| z*apC+nKAdkF#kO!|6JJa%PClU`d#XDX`huQ%0kEAt-xxJXO`1wKKX_Y z%40Vo;Ql4Xuia6&5hbxuTolobdeiggkt-Pe%T*mD#rNky;+ey@NTGwWb|s4pZ8oj# zn4Uof9u71?+(c46avhSlB!R5*aZ4RI_E~(uWM0#j* zB5ZL%$KH$gI3EdM3Olfl@UhSd<~tay@>dld@LH@^Q>sc-I77YFZa~4%u&1nT*%kx% zl};qrtU`#FwZTnI_(Q3ojcsM_)ZsY68s}jmvPfZHC}VUtb3`P9+&_RNl&}gAS2SQ< zj#5H4%IP`G`I~#p_2_rWBYxenwVoG0&zPf8#B>fs^mu*l;{o^wZplY7-CJOoBwY-P z%2OO2J|#X$tpQAvjuRa!6_x@igbu6J=$5U+DC+D`yPS(9I87gAyRpZ<*y;Mb{7*N% znE<``A=uu#cV-O?@S51_ z6n<=Zw!KJfEt&D|{0RAk+Eac5xg)nRDCr+|;YPafD}F2@wrj|0eR)j%X8IGJ|0kSaAkH!R%m!Yh_ou^&~OsmVnzZJ#jBo)O+{c>sg zxrMwBt-SSO>{u@At`GQA^@JkWOttxmIbr$I`)NK51b&n<=)?h~tfvUFiusJ{C8djW z{dlW;d+S_aJZbwK(Mnob`JkCHA-Gj;(pqgi=&Ox|ns`X16j^I@9JBizyZXa@BzI?g zuTQhlxY*t;+E0LJ&6~#Oz1Zp+9+EzV{}kW1o~%O31sL_zyhwaSNJz#(1o}v{&0Y_l zJDI)JQ>pN2|LuJG*SjLn+j2g5=e+q7{bhl$%yeYWlU;Sf@_lbz%r+RCOPJ~X^^Do| zMz(au^_1$7eRS_fZhoSN>iTs!jM<9VuNm}UNV9a%&UmbJpqV^KWb6%^hTEtzLj!t# z6oQBk=IMNdai8nXLj&BVur2e{2F;X?%3SsG{W0AgnIh+PXC~;IV0i1XBMWbVmfcsB zYdo0P`GIKFwy!{b%XPuKiNSS@v5;3^6J_frkNOf=8XXBQ+<$w&KCiUyCRE2KSOp&Y z|JVRO_J2uvJ^YgPpa*8SrAwfb*K>cYoc&|W+uZt-YhNwvUTK;sX6+PL{!H5HTVq1p z%4>t=mtuBpGMVBtIzgT@K$zA>gN5WPf@xDw`{E|#&9rQy8o{0DEy%@0PZPR;C~~h| z=3dzI84E4kXIr)+XWp-u%t>^TpzwCINfW(}&(zCWoIEGIuph+B-jPrmf2;A=W7#76 zH_k)niEr(0e~;_EZN4YMpr4(OP_F13f|AcBg@1WHUdLaTxb+@4;$gVxc#<9OX#hTc zn^(!DEqpPpbT>JGVz9fBrDnW@1f~S_r(R)92bOLNsJ`PqGE0-HZX57gF9_AQ82B}ro^HYMUbd25 z6V^)k&2<88UwkX)5gI+9Yex-}9@0MYSN!Ml9Ah7hmqR z`9*Cu^L9!}|2mGToGZvRCPZd?k_tYz6qR9KOB?mr4p)+~}N zotAS#+9W0?m#K@6EcW=sS<11u|DTX)=0eNebRL_1-rkYzeu`ydBRhVjfzG<8>lPR zE_{Gq?M=h&Zh3lbQ}@oQbV$Nc9=tOsO2kZ%hl0v}<}!NzA7#UX34?myit zb3GoOUdnVXktc%CaN)ay=kOex`>s`M5+K%oP)s zaSy0v*$?lL<9ZSlbRP6(o>=$Q>9tGHo>@H!)K0;`d{@D=+XpiZ%9_i_HDP7TkFzEv z_c>BvSKBLsHlIy-kV6C&tl!yksJ#Ao`MA>rFoPJ2Ccod1ULTZxKq_5*vdV$BYB^t$ zjjc>nFc-UMP7Dn=vm{p3%n8ryv;R65nvm15wy<}dU91!Ew|WN9X?fa5;;hWSvGtLH zTou(S*WvGkhK5-bC64(QykNLM9$ma00n=O75#4y~`T<{YEpeUC9#ffAHkU3;(P4#h z1nCl%f0&_jv|1RVBe538ikOPEzaw`>$BE?Nt%?X`ew1`D&g9Z|*Y>5#G3`s0Kq19} zzS*rFj!Q(zO`t<~X5=BTqgF%-<@Hb;-LDeJM}7lQfGs^eEQsCT>$FSi=?c6@mCN~f z(CsC{?n)!5o}c(D-|meB45NOXubi)yR1t(=dAVgZfDuc4byH&RCuqew16)xyw_gQ< z)ujMb88{xvt09>xNgDAqF%F2ETQ*Dnf|GY0u4LqK)`5*GhjK!>+T3=tD>8(wb~T5( zw=WJ(`fWmm?^Dp{E9+7SlbGYZ{O7V8Aj`BjRY8mtE&~ z$DmGo!^QmgTIGXx=NpHm{kE>O)6z*e`p2~&>K0A@`lLLDb47hAcLc}<;gx>l4WiP) z<9Fxh66;4klL@a9d1lIqu4U;I%#6f5ZaqyYwfQ&V9!`i+9XUA7Mov&XwF2FI#}jUk zo=Hy|^nN}4Wu0Q_pEj^F{8hPcL#N~I%?tCaCimp^8MD?i?5^>|NUiBx1Vkj<8jvIn zuUI2|6CjVir5Tl}43{d{UB|SW(HDi_XEe8}W9~&so5YEYU3}4on&M%A>KFBOP7?!rvYtm-czB6o7sWH2jqo;LJ$8;7B30dW3WQ7uqLSF2_Lqa&7f9VquF?1 zNKXPhmv^gZ9#HpH!mY%TKxD@K;Ght_^$0ty*k@)(Q7$ug+To7LqWkK1W0vzuA2PCo zu8lno&`B0ns&WA`d+?k6E{b<2RU&G*N^!6orCX1e%&de%+om{k@1s=u5WnKRIgK1elmySnI<%ac zmhnXTCVufIZ;DDpqg6Qqcb4>9qAmKMG8Qr^K%{x^2G#n{LQKBMFZsJx&8BiL zu0yr>IFeOuoIC}{A7O%?(#ruK;P(S`3HJYOKKJp@e6F4Qf11yI8Rv3T+x-ZeSlT$X zQn+AszGdu@;(XYWWajip3R$;p)pNn9g0Ppb4&BjPJM~jn>08KvJ+v+*E2lE6uAj1} z&h;MIno2&AxH;)pOjz7-~7yP=Almgkhm!o?YU1O4B+&hicU z9%;7Aw%BX-One`UFMo1klx}geAXC4Ca4^ZU3zr2G=sFd!q=efLHo4(=T;Oo`SMLv? zsXnH=ar4S64`U=3po=4d^Ft z7a6XN3}3!3A>iFc?d_rJ_?5Tq4fdP15o)@^k2@7zO18GcB3;yl@5Wpy}_9BpGpKNLi_g)Zl8*etHOuc(5p4hl5E-1A?-# zEXj>}VB=*&>dH}~ym6fwVLn~w#mF99(!Z?d{doqCoMM{MJC%uh5;$FCt8Lgg3~uZX z4lTETVo#_0@s(P#iPuqyV?Ar&@)SdFW=mj#S<6m>I%npP$Hr)m`yz^*rxwFbm@!wR zkGlpbwz;`6K{vMm&VI6$J&0XM*zW>f41|Ir~h01 zT1iTdQ%jiL7q99Tg(php#MD~0OIlHkUJR4{8b-3LsrW-1rp8} zoik{x6bONiWzp9hH zep%6Yk#j1$TblEQk?n1F8)%Onr@^|I`%E7uajpv!UnW^tJLgT2Jg-nl+UJZi*Y;GH z#(c{yI2hP^Xn=FD)wYt*iY<9RAk8ad)|;D8>wvctN<6ZjHs6;5arg{$xh_le5?-!& ztrvxR-N8NFyxQW+nTFpr${Y$TB>CFq84k8>JIx;$)9K11z9XMlZ|dvwiD`9<*4?r; zeCbRhKn4*=|olVvfKur%damypDp{?3-NiGCvnl1er2l`qalueGb}ezIH}Z`;^( z?76!*;M$82Y0rE3BaS!u5#S!Ak%kge@r{N%%UrC(=K-&P6CTXBj-=80juxKpmMK;w zoh^7g-|(S9|Ci2Ll8Wr&l2Z80|EnQ5)!bbT)Aco3kHzX@f?M%al!`fm@6GGaCy>0> zN8yyrExZ}eXA&tqD$g*UmKxa!yN6sj+C>Y&4#1C0g#zy(PuyD`5hthPD%YzV(B8*w zZ0z7A3;aBg)UPlm-cE zOO;O+dyZE929t04O=-+8#7$RZ0u4wZ4!;7e&`gc7$MYZJyimrn&|Lk6^Hx@@Cn_tv z(k)|jzXWEuRP42^rWo+@^w=JgNstxP;v{<5vzDwZtGDJ>R50~93a7?txY3ehX#VMH z*(NS<$m^F~VjczmS*d_gr^TIOoLrn@S2b7$_~FjHRd(DC|AZnnV?XjzxTV#Bu}41v z(koe8&qN9U{#%AE5HaA|!)1B}q`h-|O><&ZW>TaZ3_EdG z)@ga;7qZ{;lg|f5zddvB2?IV2u(C3=Mp&!!#vZxz_iOLVaTONDAi(Zr*>>RTMP{eF z$x-odXomKv-&@R4HzCmP9j2|t$q%od)!6MSqs29a@|}9f7OV2)h=@(uO_J5uH}-i; zR&&-==wu-Rh|T+dKLohD|I5vDZ}_J~{`QU6(u@^_`l4V0Y)hg2bq=z+en+Q!5YyDJ zLMNNq4wcKIci#xUelzfX-nVYbVn2or^HH{Z7kw@~MXF~~Q&wW^73__itx)DK-=G%H zFO+lc4!PJld8!Mnq6SOFCpXbcl7o~)F5E9N?aPYCugmI2tSjOPCFG3Yof{o#h5KR6 z?MmyDen@koIw5Ch*uV88@Pv~mR2g`hPYY1KjVD)g+(3+i%xBvuDC?eGbXnL#J$;4O@axP#DEA399;GawYlD582;-c|Rz_It(UV!}GjVa9Udoi$N8yon zoX~+iV!4W9-x#U?7_-X5MVC#nALnzta!k=G8cU6H25TK0ZS{D8e30qbr6$qEatgmr zecE`YJWLNK)YMj#8M}U<$VLMrH4DHv0ttqDK}$cVrfT>SQCwW?yn|9LT&&E>G+n=w^#I!x5%Ni@tI5WEG`}j* z`(<*_^1WCUE(>0LeejD@$F%)-f;aK`bhuuAS>K z_D{%?Io0E-T%NO$h|S;S1X+HxAo32kuK_Qr>MGJ4{GTDCEEo4aVwsw4>E3%}ZW-Kx zfOl(}*@PlUMMKVATA5nX<4>5imM^%MUgZ~?q5irkn`W7#JER9(%MA)n4mqhEWMOGD zlKp&B#0Gfc5++PkMiW{?j$#Ffwp0FANW1G1r|1T5K6=y})J@AK2g=CTPGAY7G2b5| zVQ+aa<3B*nuoJm_E%;SC3!56Vb=#{v>6h!jmrWKb*;Ss!)s68J<5K;9eOu!v8b~nF zb5rY=ZF7|lnz54TSj*);BC8Y0-#4cJ%hMazU+|zYmRR|XfO7HScXx{J+SIE*;!MbD z`YC^#>}6b7(?55?6y|d7E-{xb%we7~o`oVBXbI1dZW>a`%{?Z1)yLgC2dd$;+yM2Ul3ny8Xp>WR!g?>?N{*g4r+my^57uJWSo zENUn($EbIRl#5F#_gI|P@y{GC7(gxR4{L|*Yv^2n3BY=M(K+q58#ccJNBc8b7TTECEuR!S{m8-noh`=UJ&h3JyySE$a+rGLuwA*EVnz{lw zIrpC5f>?udODSAY(Yh3k7<(1H09Hz~*(;Jic6?>3wjeQO zU8%e!16L~n2U^<7^;bet^gA~~^oNp#@4H=3kH=fJXOsYg_R?STgxQ!=aj`j9jbZ#g z9cD|!u*aP1kClD77!;KYBwLEITBYU+Qic_?X-!i8ug<x zLwHWkK6|gd_FC_|)_Yjw)`x5ZNfQ(&x?L*htmz{B1l1A=y+c^pvG$FjiB_a2R>;SB z<91`Kr{;!_dLI;gw0<#ssqrXhDxLAswOp+ci^=AX$G&!`$N*eG6j&5_cd2$1iIYGT zy7xkCBOTZ3omsSt=6&e`PQ&gu1(LOd(`vg3YM@;-!d0M06gW}*PZ53q&A&z?j`3L9 z@OE@Xj`#u&?w|4Ql`-w+L2v^#=z`C^O#A zZEb4bEEaNXqKs{n0>q!pA<6Cs-zysLPsGu}t@l%zK}y_61qYzx$R=3Xdmw3;Lp6Q& zx$D?gj=O&KxI!{A>9BY8>$bcLAM$&B`Y0hoonr*U0qe+(uZ?3i`>o(Ioqh4nkKI0} z!LmLlY&y7tR6l<$DBnf#sjGNaXWEm%6=$dO)3ccogpwIZWL^wIw*`Bek0uYL7!qyA~s=3V9VU)4C?1ipQJuJvs#lgS^*q1IZ+b-P68cgc_(mCx;aB|V7xzC8Vt}FYB4g@8< z?lS?(p#YeS-ZXs7s2~v`xykl|Jt3gSe8y!d<1p3HbYnir!%2p-Yt^$iho&$+gsiH8 zR;fK);aRNTy29c$@7v4G8KDZ&vu1^H=~i6DqE(og{dwQx9Pp3?$;4TW-HpsB!c0e4 zbu8jmo~JdFyOVz3*zU@-TK)|yoqdJxujM)LDLzsM3JNQ*SK7>FI~57ATgB3bi7feG zRBzvk{(u{98b|dp^efVj-!Lx`K@1i+-}c^#{Nw6zY+=5|^3%nG8_yvjc58)p+qUXv z>ofNGCkiQ$Gf3dp1KA>gvrL*ZyZ~gfyM6|{8#Jo599EEgZ01~;IfsTQkG9f#Gp+R1 z8tdaxhyiA_J_bi+Oq=_&F#O(jg;UVcvat&4Lu>*cE6o7ZLz2Vs2tla`$Q~xAYb|S{6RBFU7p-Xdzz_U{Ipln#tP)IBr6SAi zA?#+YMbF0gvT0SM;tET`F3%mN(ZG%$`uPRVV%@zD1#WnNbwI=waRr6IFKUfGX)fw# z#Kcrml9sDg4zLIYVmKvm4PO)WVZ^2&8e=)>H@K-QbGpfM21o&Qcbt%Hpo?+`6r@5t zs=u@y&@%hXW9CHsC<}7=>-T|@f(e!erP#gEo*`+FH}Xb7>Z$qc_YVub^iyzRA#FOH z`R>aTORHbGKTLJ2iVL;V;E{o?{8bpIiA1o;14tB7!vv>Plv7@$dtf)CSS>9GC+a6< z2tV_ojguP~`S$>f>1863wO5!OTzDCXcY?6*|)v{++af~P*y^w^6$8^ zlQViQ!7iY&B>ZsKjYt#g3`zXtkC$CSNX_o@{5GTj#={7=E-cBrgGiADDqFFHp2fmM zsMm7z@OPj}1bKYUc5CW0)V*k8E;4Y1b41iM>sQXKT!z_np($1=()SzBX5C!RL11pB zDAq}LZ4A{98$&G|2l!5&4!97$ozx^c87cW3K?u7a%`P*aw)BZ(e&x1vDK!t$4ztsq zyivX(0NC*Hm9p*~V)ov_p{u6u`O)=FyK}R&2HHH_Tmg0Su_i&;Oux@I^4m7lEA zdi?skW>2Brkf<=xEz$jCovn4|lvKs5M!8YcU+T$IhVG`V%TcSu@inj5Ee}5~bL`>> zZg#XqF}n?3ELILUZaI`?TD+8a`y`Yg>%HaMiGcm z!wub;zT7HCFA*Y@Y<#g;S%uw)>Z`RM7WziC?%_RMtYwpv^lt=Iw*vDA6#FKmDU9)+ zSfACXyTZZRh}Vih@vXAxX|I%TXpo`QVe87_d2NhBse4BvA>jN#i3*n&q53|Ccu#8X z-IieAb!?w#wnY_2;X6AVC5UQ$cKgCG73mX9s(B*fyJU%;8@kzr!$*5dwSE7ks5*P! zA^NtyoK=I@e}@MP><1CUV{-kjR3;wHsJLzY*^K%VOYe=ZB@({5f@x}2r*y4KW{`RA zjv`7&$t-92B@pQmZFy9IW@L9X{xAD=@_%K&yifiQ_G>bbWTXp?_)=_z=h~UVGXkcoQ5c#OExWMWS|G*m9>gS zEQ$*g(5k(M$1(xPE~NFB&j9!2U$DB-+>S9?#F<;2K26eTXQ}KFH5jnY#3SVZ9ZYL3 z@K175fP_?L2~bEEP%Zp#uwXvhuhz{F{8&k&)FsKl|6Tr^usl%8umGM=e)6``dS}x) zk&?!!bB{S`iv7v}YLs9Qd+@k1fVVQ^Fk&(A=?h7wfE{`!XlY#3J8}{Uv5md9!Yhz% zQ!k7NGd^{5VM!7;`6=o71m6|t2})>wPeV{%aW?KKn9Xx_C(4ksYdw8mL=+!%BzTb| zxJ^As1=^l|{zy^#=OUGV-Q|UsJsO*J-7m~epv4VcuKw*A_F<=bw*>Sa*Hy8Z^$xY< z`LD2WcF8?mqnDMktj6H07Z$=KzB&ecf9j10gC~{HS&^c;VmCb*TWMBq3`IVc*38~3 z886*eXf%>0E=t3!XjNe6N@q^*{e-Vx_2(cNe)KkA>$%UazgXYL{tdsqOh+_6mack8 zACN2@(pLkz1?JxW;l(cBKl!9!Ri4|oToO35p12|eFvtQ&S&OPK8`{RSCOnq~{s+9+ z`~QR&d&7@4pGvpGcG>T0+h`m|At9V3ZsTey9`YoXCEgntOlP4n9hC#_FgZoxY1TKT#_p3lN7n))A-^I zXCge6V`J|?_f0isli^v$F5R6zAj_FIz;3L>oSq|hHjSbLX8}7nCuO;M1%w!>~B*{L-Ixp`--|T z?i>htw?rzN6gcBT&+2ZnU343Zx>lxoZV42?du;pkTkcdhm?WV!u%(|V)}f>;5yuh>6y#JEjx-EmkAi+~JQ-1fX`tqrwqjP^YpNgHL zKlz@ZT;<#AD!a+gRbhOr6n=EpN>>&bA5|L_W}LI1_{JpS5c`voJ^wlWQGu|~H^Y1K zP22Tg0nq^KS*r*@$I&JkpmHU$^qy3P3e0$?7gD{Nh>>tU`q(1M4v$>1RxJhxSQRe@ zC-~?Ou#}`GLMHcGyjFDscwigS9%IXsP^FAwJR+qMcH~7{AUeGj`l4s=1}-M^xbU_s z@_0+qV7Kv=Rxr*6iZ_?%b4bM$j!dvOl)A-hp1J6hxu}BM?i{Yz#m^cMSUf zPYVEiXJv0NFnInZ*lWQ1;2~`96kL!1R+ZTqR4_PhHLI2zsZE4pqaJ>eyWJ2x8B^Pb~&vfcS7MgvSmteWk_X*bG8u)SyZDo7&{FFw%Gb7|`;XlG?v z2fEj$Yf_;yrQeM0d$OZ$PY2Eu7oSjN?xHonnH$%HDH*KX_*Kp@# zW1UyAVh@8;u#yE)=CX!uS87y%<4Ok{mzWq=xp*Om8hIT1`lzpz0gKIhR_{Zx|=soyFDnC5zq3+{~wM zgJ7=dWrjPEpeg%=sLCofssMm2=uiQ5Af%G_`Dn8xz!-GUbO6a(w+a+jEcQ0fOx}EK z-L#=H0_FKs9Dk?Q1B7h-xwS6UxCnL2k(Y+2Nxg1#*)le~GBEF_khg9U_qAEgzfC^s z9yo3CdKwbzj#_uP8@)T^NC`+S8{O@{`G5}^p=dP)xU*oMrbNP_x%qhue-|9WP=!ce z=3XniI5|hG+LhhIcs;IjeoyW>8~rd;P_D~$a*6CQTcuXTp;F32KCYfJ1K18wm%i|2 z%LN++8`EuG-w^vc=9p*h3Y~OwXEIGcADBlNgL|eYPJFm1hwJA8;3~avxEQxi?1dfN zNqd|a$DO^UCJvv%bj+nqEofVTh3rkC9mW&AM@a1+S?jsE=kJQ~Pwxm!-vQ|CeUbuU z3HU>8j1IAqfuY3o!2rI}n^?Q=>k+hH$|G`ee6{*u8UTcVBfLJ(Q9dGYYvMW|fC2ab z6}F%M+u4QiAaDabnJGe!+vqDeG-)?<6~c;BRcWzJPt~v zbsY_yNW5ckoKu-VV$``%Q@nD%V~{9Y`EjI<2f_WkcV5YMZP6KMdc1G}*kxQEqhbL# zpSOip&KoC3ulbS=m9Ci#fCE=#M>?IFmCC&?RMs4MR!)i@t0vMEH#h!2yAuMH17(7{ zufVy~>VC1GiGV%9ObnL5zKn@bIul#ko&;~=gZhj1N$dtzfaVEtCa6s6JGlSq1gY0T zQ|x(}iz={tZ{ok1W)q6%fHgZT_7o3V>7akj93^X7I>IZaU3Ex3%W5tLJsQHMuN6;& zZ^1;@H9V+Aa*WFBi^wh>Rf>e--NZ83pH5lGJ=wsQwz2e>ZtMbao!-{3v z-ZgcBeNRE2T7}Bjpqe?P<--#&tHlny;k)W>SJ+}j<@N=|Q33Bueb@U(@r6t4sKWqF zw5y*x>;lkzgT4_p4Ol$zdzG4$Gj22WGu?-gb15~{(dJA?Wic<~ODr`9oG!AQrrk1l zA-#>}93nn?jLj`QM6s%VMKw4&&nQp_uCw;E=$y_21P%I{##(^o<$=RUZooS%&4c9r zYNKrOHNlZbUz#EU_q?Np9$mm$SM>E4x!XFc@>b@4@0bkA{6tAn5?g$|^QliJ<6MMhHX;;i1qp4#7C}0#XjSo_|{EPLEHbmxqK+vwwuPI{)|1MK+yi-ZT6UFtJ zZ~91_7eM4+N0lBTO&|KX0VuDD0a;~6ou%bMdy~c{&|vcS9Rb_W-gcK~9ixFPJ(DXK zqcMDH!Wh9BAgbT}BaV}qLDvtcv<2Ya@GmRnu_c0`Fq)F#pD4@z^OPx-P#Ytl*Aj7^ z*W#?HAT^t?)DQP682>7Ew0{S5aP4t^H6rJcgqj0)tTK3Gc8St-{cZky)a_|uJWo8@!>JgPT4nF4Tms!)UCfZp)^imNh>iqba3 zZY!gYkoPECpdQaC^Ng+nECulP08;yMlXVrXSzVgv>vHRW(r(PZ^_zsC&vl70&+4*L zPo<#5#W7unr2Uac+v$VB1)b4_BLcg7s)F--;g>@qBt%D~4~y7^fO1V2Y(pim7NN+k z;US;T)e#h6MkZMyuSLS|PDmdQq zyhZt-5?AIlquc}TFT&q&Z66va83TIb@;NwIOiD5J7{rbMk8HY{pZ8c*k97FL!?D_< zP-Arv_{9uUWF4{0dkFkmt`38EPD$@A{e8nJG#d&lD)1*b4DH$L3fMo6T#dDyy6gSI z9kM~dXJu*s?AGJ0>w6B)y^`~efXDT~{Om`NP$K_10lPMJ+s+J2b7>@dl!dO-nGRJR zHBh>WO3MEBcF1^jlP)t^4VB8;Tv@X1b)#nWAX)djod!=PQLJUxHoV` z`8H)aBi-Ja=zQ>N&CI%0ji2V{_ zpfV@dTX@s&BGiXwohTW>dkv2A2?TKQSIqY0&~CCn3bE$17BIgEx}6a5s{BroV5bt{ z*tWt&^6b-eP^ULTXvamNF?!vvyrBwuUj>sHgvLHRFwcIz6oW#d{A)Bys43$>vGlsq z@z0{O)d14_aH7x>VtLy%?#ft8l=S9gm9yiR6?vawc0q1Lgp<}LuU-bK(tZC&Fgaxy zS}gBWM=!hhO3rQlD?%Y^ldN9^W4DfNhhX3O+}jn&8Cwzx$f`z7yYH0%#*nV}5OX7i zpHTMHUN^~#91?HP8Z8ACj}=tt`nU=RnJPmsQsWXM4ii*AWx#2}>M*r7%tC`qQJ{U| zc-`8aSa%;9(BmuWujgZnVNbRvSKzKd&o}K8cRqN}ylui!n$8dG<4$6=&+@Kr!U`u* z!O2nWfrIr|(Rj88(eYF-#dsXve3~4*IBwLi&P0FISh@Y!w20j#iP^%%QrQj2suP9v z%!@lNMQ8+TmR@;1bsg7lE_YzT>o zh2#r(mvNap6(c;Ze2#@SN->JKQ|bCxnd-Y184uQQOoPWdq*{(Ga=CZMReICk3&%AT zK$t+6G+VuZN!RJ6la6oH8OJFoj}8;r**&(7LiaLy0|uPJ+(pm<#B=_Krz7F=9}5DF zwJ0&k*VV(ebSnad6q9d>XYD;1fgPm+GM6nIv~E{O?Up4$82+HpxaT^e=EtYOIJVLN z-X>4|fT}5BE-@1tgE}*&#wAqe%Vx-jxxvXdjM} z_0&LM8$fTD1)cij@A9iY2W%Z6l(CMN5F?(ZX(sOZ4$G6qAVt)8kz-pRJ89CdaxJ^S zx0i*_J!}&`RV2A-#xLmo96uiNISsq>*e&)2qA)~g@th`>lu?#pmy6Y(iCpAzKcv@Z zH)b(-+{!5hg<)-58Pwvvwz(!Ec=ZQJgd~N9DoIQIFgy!sOa@H-H8Bde0km6}a#nV} zrs7e$t`T?%oHE~6gGeJ?m?c&idWiBv)j-#a$o_;5`&yj@NA%uI;A7i8B|kME_(cIwx2#gXgywC z?^GqlaAnzAfF1H`_`nJd5Cb}xY?C$3nx=p#7D7y}Zt=V_;9U z7_W0S|GYPBA_?BUx}Z(S{jGVbk)0V)_i& zXme(YKOcg+2%e)NLm9HsJUO~7wBE)aiONgzUvBU=(+pflR#m? z`uVce=1-U6YuZ7?YTZ9}Ur9m36hIH5pYRoz zw#`bHkIcugoGG;5#Qra_QjQ7sTo#_glN?7FSU#gy=~?MvHNml=lA&q#4tL`&|7eo5 zlheLrfT}|)pQ!jrTT+5=V$A9-Zs(YNUQeq){-j;cm=x)V=aH-J@+ONh@fQMpcw}?S zi@d(vUf!qNwx7FehbStS#|$^UQ6>tSN}fa&)p3Nl53Izi$#}i?gu_-O>ISPek-o`u zwp^hP(Lg_&fTGaEiMk5%=JS-r7}SsLy8`NpK|@LRq?+jmD1DvFf$B6&wDpH;R5$tA zJ^Y(=du>C?Eyc5byxU#t7X1>}NO79b%txXw1%Iob_ST>b}sa@XA!)7uLrY7F{Iz)`Vl)p(!fl zWAlvd;CqH4aPJ_?7wHIQnKuW#l8tRY%bTCe-F=6?n&U@Jj$-Ocy`Zfz!*9<>KPvmC zENCll0UavUu-?Pp#)_3^l4E6fYK~HM84{NHa-g zWUKl4!7Whz_YF=qA!;$#&PEA1w8=8SLrc`BwuX@I!fgIP-Am;2)7$a7u;T+W=7wtS z=O39M9yL~9HbYpvBObZFQuTDzH^ov(9&W{*ayFJe|03G{aCWZA#%a%vuL^L!m3H*{ zhs`tz=tcpY@Thf)qF$F@6sZbfOD_7s=tJ?lhlwoHaS|T z{Dr>PW?mK`Ya_X~J$#2xkC`D!VZopDYPz8+m&^%C#L?6W?Il~~J(lbuUzJy8MvaV8 zFO1HQ&ysm>Z9wzRA_;D?#8vB|R?|9WYrCXbqLb6$@M(oRFoIM1=S;`h8(9Rk5CNsa>5d*Qrj)v zsT?0ldm=WcZESk{sog+XPI{T+lMY4K=Zpe%d!yj4TZc;?owt|8ZIdt84?rH8M)F?a z=YRgg+~hWy=EBKmb}GseIpO;*xqmj@6S`6mab5hCW~$qfcR;sn>&mS3ZIctOCt?&_ z;~#ZT?k+g`6rDnmIG!qr8vd-kMlj%?lu~4Q7Y|dff)^ZqFyo*0>>ZndtWm#9VuSju zy~sm2<2lvNLr2y#17yBi0TU<~%&e>og5nKhR-K+-dZIPwfv+k9JzzA9MU#zX2XxVQ8;hntudGQNT!J zp_dZ_seMagCd9F)!M9lDyD4Tr{BE^>l_`6ZFOwohovdorr^iGz7WtAiX1{CnW>Z+c zK-R03oGVUi9Cag&4!9#EK9(3RaLr{+S_msQI2DKf><{tMIeRctzJ56HFvb=_a4u_F7#4Nc68nXyP-TNQ zCGb@BAn#`FmEZn0b?+#1=$TxcN7q9}9kH@~ET8A@SI>N+yV9uzCd~~^zq59_QR;NU zg)mUq-Cg+&3sY38R$yJj0Lp84R1t5d?6gDg%~w!kc2x~f&HG_0r906qO(OIMaq zxZe9wtlFP{$I*3V8+_Jy7A+<|r}&muE}(&0m^cj&-1Zx| z<`rRn;*<7nk|Q-GU{FPUg!Ih?Bf@Ms z-|=x7^~TszyJ6LR(4rlf$c{vLPxq|KihC@R3af0)Zu_D ztq!Ee2TD&Q5^^Z@kI<>w1*_FX(pHea&(umGI)E%neUh2%ee$w?JqOx*Z7m=6E;b0DL?0mginE0)IckM#`#)<@hJ^bktgoPfJf9}>LLHZA0gQdV|jFMigp zE}1Nv!y0KIiH)DjXB;9!pWqSonvdJ2KF0UNYPBH@OPnmAQ^7a-(T?UAX+`dB{M#PC z6qE9!;@sguurs>h(D=_?T&Tw3D21hXIr<@wm`o4olh1jLjey&^)S&MtRgnGGWtY@sB@av~T zliSp!(sZHA^0RB>4jeqG7`*`{i%v7Ev!?@m1uGDEK&?c#@ylZ!)%fKL*Q9s8zq9}S z-X2|_hge0v2WN3|99u198t`-MIXFv~LYmo$1s`%1fPm6+J^u7b-#XJ7WI zX`a4R1*zJmy1;KPJ2n{zUAQ%MI|u4pl9_0979|P>-%wEo5nF_2(m(iyIc+$;W=2aM zpQ`s2ta9c17*72OB?W_9cx|EsV==wuPma2$jWB6Z1Y1OqnZ-XNz6OkVdELL${4O{T-xGXU;bCpZsc;_}m^NtXK_HP*X=MjyRl~s^T{vEQQzssXT_CQ(18b$uEzlz@m zMFonSz`Z~Jb)%US2ABhmKiSKfQ+<3PZ?!sJ!Yn-h?WSFt&YNx^VH&#C#_svx3gSNY0Zsa5KvHM&NF9S{bwtNMRa^P@JDZ5xqnb&I=@WLH0~yr29%J@&NqBkSq4 zkR0Ps4K%iZ9v61S+x}w}xvvld4Z)`X+Zd|C61--5lV7znr0?r%D-|WC>y0JE#B-3hxDDJyCLNvo!rjo z%fl-2t2OC`=p!C134vy(og~u9&abGqCa@(XUYnG4_D9o}jm0G!0rDjZi-icnsl!%# zJMc0N14QSf&|gDRyWg~fC1-Et>+80USbai5ePe#^9s>;3&~<9j=`_ODNb|b8vD^3E z1!G2EhL&HH$1HBFs4a(0u^En@8LCW8E#+^fD*@pV8AU8QsgIdjr=1J}k9~H@ zhOK)d5kt9>nwT)#_~?$)Ld=@YR9)2sPGLxFz)7(r%Zb=kpH<6qI%DsE$$eJT$dqFv zN(N7ogCiT;EN76emMjH1 zD4F0GgZkWiHJM{PCR0{~ z4B>n!>$S#ldb}~u{9NqU40-5WAH};{7OW0!J1M7+Uo!q=oEH;Coa?RtVeBivA$eV` zRgfcu{MDwvr+%vP8=RHJ-useP01E4F_;LfQH_W#U?Q)5I8!`)Gkz+*Z7&5=+1^>z; z@(lThMpze%Qd^4A;!ba9In*eAvItg_k-2F(5UUM}xcRYX)t=i&?d9b`rhtz7+%Z<` z5r`2d=P4j3s=h8!=%G4#UwcfcEBnp(s=ldJ`Paa`hw`Blf*&Gv^tTFEt2ceDAb)(o zvr39``#A-(n~v46o{mTsCSSo0m482VRY#P{01Ngg-?3 zQRf4w>}K0gQIoljm-q$C8}t1ZPS9Xk5-!k>W^k@)t1tbxwsVi+bv5Lh9djdQ>Frhr6ZXs^Rg}UrJ~}Clurw-k1vuX-JD+`IUh+$l4<@_ zI{>D16I4YSc8%Aea~8{bX@@HxTjR`dwe;vD*7EWPw-X#`i$7er!Jul@{ZMZ}TSX21 zcZr&G)icXhS5BgH>16`j@K;sU<~#PhiWN+xyJX)mk85?umfrtrBl=N2NUVz0-Mu~) zW&gnkpS#$EiSh(%pMvChWGTBL zh&aeOaIqo)Q?4*w!M}|ltQznIu-T5N|B|-x51IHhL%LL;^dvU2@Ae_b5&w!2_~mv7 zO~^|Fa7>!uxbIBhqJ)+TG0#7tQva{je27w(8eqBp?PAjG(myy}#yI~vR^uP|I1SSG zmRkM_M6UB&Zd&@*qc>}06T7rIC)RObPU~e$Q-~`SX>t1K15M$Ni{n-(#8Q zyb`62DR6Knug-$64IN?0!5tL$wMdFAn1m0QDLlyLNy)Y;*}xI2j62c>D=~{{_$=F< z4U*-QYpENXq9!VHYy7^|r0dU`_Ft(Sqq(HppQtE}n1B7ZXyStbCb``pA$;~M4mkHL z<^tqZaoH*z0DV>OHho_6=Rug$)I`1w31gj|{Q*yHzAdMVq52E}wU3`Q&9<@lT4?oX z=nYXf<_l+kfN3zD-Ve+RRo}&n41)TCe7}`Vxqmyj|nz4&LQRK(% z)U)|*bcS#(okX+H9lv=9g01y-?hQi32978R&Y=tuP=}Od59p+7^M$DiR$_Qf zlo|QdDIhi}q7J%mz#H(d?Bg|Aas+|Y_&{WLDZpW;)$JF7Lm))rcFgkVXgdZUJaxgS zn@E1%ihs^bAb$tKopm>PmEGg@_`CZrnG@-UL?idfYb+-7E`?_p4=Al$TW)3k^+XPj z=cp%e1h_ScSCTE<7r$=PZ_HW~#^%}j)Y{Mr`{oQ$n~PTq?30|0+8QE7{J7Ua^HR?; zTl98G=G?n!7g?DxdN4gfi~-`bTyYuR82?MP+s7a=98_vsay8SbIFfWn`ju8w)@Dd! zE&s;L$f2%A#q@V+J@wrwHLDuLsnI1u4An||yA>??u)P6OxXe=C2EISE;fI=rGgJ8MrWKYhBhR+?tD)d}j`XuYLD-zeFns2ukxkO2GZ9qI_X>Dwv!e=H5D7GAeeM;ir z`wGgY{gYFEQg-E;+o$YRGf5QC*qIF0;biMy{QXFEx=KbAI6t;UhG_nAPS6x(E8AV6 vpnE@T)|-EBxLDwm6$7UYUpKAE*( literal 0 HcmV?d00001 diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts new file mode 100644 index 000000000..f63867237 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts @@ -0,0 +1,228 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { Aws } from 'aws-cdk-lib'; +import * as cdk from "aws-cdk-lib"; +import { Construct } from 'constructs'; +import * as apigateway from 'aws-cdk-lib/aws-apigateway'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as logs from 'aws-cdk-lib/aws-logs'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import * as s3 from 'aws-cdk-lib/aws-s3'; +import * as defaults from '@aws-solutions-constructs/core'; +import * as resources from '@aws-solutions-constructs/resources'; +import { RestApiBaseProps } from 'aws-cdk-lib/aws-apigateway'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; + +/** + * The ApiIntegration interface is used to correlate a user-specified id with either a existing lambda function or set of lambda props. + * + * See the 'Overview of how the OpenAPI file transformation works' section of the README.md for more details on its usage. + */ +export interface ApiIntegration { + /** + * Id of the ApiIntegration, used to correlate this lambda function to the api integration in the open api definition. + * + * Note this is not a CDK Construct ID, and is instead a client defined string used to map the resolved lambda resource with the OpenAPI definition. + */ + readonly id: string; + /** + * The Lambda function to associate with the API method in the OpenAPI file matched by id. + * + * One and only one of existingLambdaObj or lambdaFunctionProps must be specified, any other combination will cause an error. + */ + readonly existingLambdaObj?: lambda.Function; + /** + * Properties for the Lambda function to create and associate with the API method in the OpenAPI file matched by id. + * + * One and only one of existingLambdaObj or lambdaFunctionProps must be specified, any other combination will cause an error. + */ + readonly lambdaFunctionProps?: lambda.FunctionProps; +} + +/** + * Helper object to map an ApiIntegration id to its resolved lambda.Function. This type is exposed as a property on the instantiated construct. + */ +export interface ApiLambdaFunction { + /** + * Id of the ApiIntegration, used to correlate this lambda function to the api integration in the open api definition. + */ + readonly id: string; + /** + * The instantiated lambda.Function. + */ + readonly lambdaFunction: lambda.Function; +} + +export interface OpenApiGatewayToLambdaProps { + /** + * S3 Bucket where the OpenAPI spec file is located. When specifying this property, apiDefinitionKey must also be specified. + */ + readonly apiDefinitionBucket?: s3.IBucket; + /** + * S3 Object name of the OpenAPI spec file. When specifying this property, apiDefinitionBucket must also be specified. + */ + readonly apiDefinitionKey?: string; + /** + * Local file asset of the OpenAPI spec file. + */ + readonly apiDefinitionAsset?: Asset; + /** + * One or more key-value pairs that contain an id for the api integration + * and either an existing lambda function or an instance of the LambdaProps. + * + * Example: + * const apiIntegrations: ApiIntegration[] = [ + * { + * id: 'MessagesHandler', + * lambdaFunctionProps: { + * runtime: lambda.Runtime.NODEJS_16_X, + * handler: 'index.handler', + * code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + * } + * }, + * { + * id: 'PhotosHandler', + * existingLambdaObj: new lambda.Function(this, 'PhotosLambda', { + * runtime: lambda.Runtime.NODEJS_16_X, + * handler: 'index.handler', + * code: lambda.Code.fromAsset(`${__dirname}/photos-lambda`), + * }) + * } + * ] + */ + readonly apiIntegrations: ApiIntegration[]; + /** + * Optional user-provided props to override the default props for the API. + * + * @default - Default props are used. + */ + readonly apiGatewayProps?: RestApiBaseProps; + /** + * User provided props to override the default props for the CloudWatchLogs LogGroup. + * + * @default - Default props are used + */ + readonly logGroupProps?: logs.LogGroupProps + /** + * Optional user-defined timeout for the Lambda function custom resource installed to do the OpenAPI definition transformation. + * + * This setting does not affect the deployed architecture - only the ability for the Construct to complete its work. + * + * Defaults to 1 minute, but for larger files (hundreds of megabytes or gigabytes in size) this value may need to be increased. + * + * @default Duration.minutes(1) + */ + readonly internalTransformTimeout?: cdk.Duration; + /** + * Optional user-defined memory size for the Lambda function custom resource installed to do the OpenAPI definition transformation. + * + * This setting does not affect the deployed architecture - only the ability for the Construct to complete its work. + * + * Defaults to 1024 MiB, but for larger files (hundreds of megabytes or gigabytes in size) this value may need to be increased. + * + * @default 1024 + */ + readonly internalTransformMemorySize?: number; +} + +export class OpenApiGatewayToLambda extends Construct { + public readonly apiGateway: apigateway.SpecRestApi; + public readonly apiGatewayCloudWatchRole?: iam.Role; + public readonly apiGatewayLogGroup: logs.LogGroup; + public readonly apiLambdaFunctions: ApiLambdaFunction[]; + + constructor(scope: Construct, id: string, props: OpenApiGatewayToLambdaProps) { + super(scope, id); + + if (props.apiDefinitionAsset && (props.apiDefinitionBucket || props.apiDefinitionKey)) { + throw new Error('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified, but not both'); + } + + const apiDefinitionBucket = props.apiDefinitionBucket ?? props.apiDefinitionAsset?.bucket; + const apiDefinitionKey = props.apiDefinitionKey ?? props.apiDefinitionAsset?.s3ObjectKey; + + if (apiDefinitionBucket === undefined || apiDefinitionKey === undefined) { + throw new Error('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified'); + } + + if (props.apiIntegrations === undefined || props.apiIntegrations.length < 1) { + throw new Error('At least one ApiIntegration must be specified in the apiIntegrations property'); + } + + // store a counter to be able to uniquely name lambda functions to avoid naming collisions + let lambdaCounter = 0; + + this.apiLambdaFunctions = props.apiIntegrations.map(apiIntegration => { + if (apiIntegration.existingLambdaObj || apiIntegration.lambdaFunctionProps) { + return { + id: apiIntegration.id, + lambdaFunction: defaults.buildLambdaFunction(this, { + existingLambdaObj: apiIntegration.existingLambdaObj, + lambdaFunctionProps: apiIntegration.lambdaFunctionProps + }, `ApiFunction${lambdaCounter++}`) + }; + } else { + throw new Error(`One of existingLambdaObj or lambdaFunctionProps must be specified for the api integration with id: ${apiIntegration.id}`); + } + }); + + // Map each id and lambda function pair to the required format for the template writer custom resource + const apiIntegrationUris = this.apiLambdaFunctions.map(apiLambdaFunction => { + // the placeholder string that will be replaced in the OpenAPI Definition + const uriPlaceholderString = apiLambdaFunction.id; + // the endpoint URI of the backing lambda function, as defined in the API Gateway extensions for OpenAPI here: + // https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-swagger-extensions-integration.html + const uriResolvedValue = `arn:${Aws.PARTITION}:apigateway:${Aws.REGION}:lambda:path/2015-03-31/functions/${apiLambdaFunction.lambdaFunction.functionArn}/invocations`; + + return { + id: uriPlaceholderString, + value: uriResolvedValue + }; + }); + + // This custom resource will overwrite the string placeholders in the openapi definition with the resolved values of the lambda URIs + const apiDefinitionWriter = resources.createTemplateWriterCustomResource(this, 'Api', { + templateBucket: apiDefinitionBucket, + templateKey: apiDefinitionKey, + templateValues: apiIntegrationUris, + timeout: props.internalTransformTimeout ?? cdk.Duration.minutes(1), + memorySize: props.internalTransformMemorySize ?? 1024 + }); + + const specRestApiResponse = defaults.CreateSpecRestApi(this, { + ...props.apiGatewayProps, + apiDefinition: apigateway.ApiDefinition.fromBucket( + apiDefinitionWriter.s3Bucket, + apiDefinitionWriter.s3Key + ) + }, props.logGroupProps); + + this.apiGateway = specRestApiResponse.api; + this.apiGatewayCloudWatchRole = specRestApiResponse.role; + this.apiGatewayLogGroup = specRestApiResponse.logGroup; + + // Redeploy the API any time the incoming API definition changes (from asset or s3 object) + this.apiGateway.latestDeployment?.addToLogicalId(apiDefinitionKey); + + this.apiLambdaFunctions.forEach(apiLambdaFunction => { + // Redeploy the API any time one of the lambda functions changes + this.apiGateway.latestDeployment?.addToLogicalId(apiLambdaFunction.lambdaFunction.functionArn); + // Grant APIGW invocation rights for each lambda function + apiLambdaFunction.lambdaFunction.addPermission('PermitAPIGInvocation', { + principal: new iam.ServicePrincipal('apigateway.amazonaws.com'), + sourceArn: this.apiGateway.arnForExecuteApi('*') + }); + }); + } +} diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/package.json new file mode 100644 index 000000000..8f84ad6ce --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/package.json @@ -0,0 +1,104 @@ +{ + "name": "@aws-solutions-constructs/aws-openapigateway-lambda", + "version": "0.0.0", + "description": "CDK constructs for defining an interaction between an OpenAPI-defined API Gateway and one or more Lambda functions.", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/awslabs/aws-solutions-constructs.git", + "directory": "source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda" + }, + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com", + "organization": true + }, + "license": "Apache-2.0", + "scripts": { + "build": "tsc -b .", + "lint": "eslint -c ../eslintrc.yml --ext=.js,.ts . && tslint --project .", + "lint-fix": "eslint -c ../eslintrc.yml --ext=.js,.ts --fix .", + "test": "jest --coverage", + "clean": "tsc -b --clean", + "watch": "tsc -b -w", + "integ": "cdk-integ", + "integ-no-clean": "cdk-integ --no-clean", + "integ-assert": "cdk-integ-assert-v2", + "jsii": "jsii", + "jsii-pacmak": "jsii-pacmak", + "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", + "snapshot-update": "npm run jsii && npm test -- -u && npm run integ-assert" + }, + "jsii": { + "outdir": "dist", + "targets": { + "java": { + "package": "software.amazon.awsconstructs.services.openapigatewaylambda", + "maven": { + "groupId": "software.amazon.awsconstructs", + "artifactId": "openapigatewaylambda" + } + }, + "dotnet": { + "namespace": "Amazon.SolutionsConstructs.AWS.OpenApiGatewayLambda", + "packageId": "Amazon.SolutionsConstructs.AWS.OpenApiGatewayLambda", + "signAssembly": true, + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png" + }, + "python": { + "distName": "aws-solutions-constructs.aws-openapigateway-lambda", + "module": "aws_solutions_constructs.aws_openapigateway_lambda" + } + } + }, + "dependencies": { + "@aws-cdk/aws-apigateway": "0.0.0", + "@aws-cdk/aws-lambda": "0.0.0", + "@aws-cdk/aws-logs": "0.0.0", + "@aws-cdk/core": "0.0.0", + "@aws-cdk/aws-iam": "0.0.0", + "@aws-solutions-constructs/core": "0.0.0", + "@aws-solutions-constructs/resources": "0.0.0", + "constructs": "^3.2.0" + }, + "devDependencies": { + "@types/jest": "^27.4.0", + "@types/node": "^10.3.0", + "@aws-sdk/client-s3": "^3.0.0", + "@types/aws-lambda": "^8.0.0" + }, + "jest": { + "moduleFileExtensions": [ + "js" + ], + "coverageReporters": [ + "text", + [ + "lcov", + { + "projectRoot": "../../../../" + } + ] + ] + }, + "peerDependencies": { + "@aws-cdk/aws-apigateway": "0.0.0", + "@aws-cdk/aws-lambda": "0.0.0", + "@aws-cdk/aws-logs": "0.0.0", + "@aws-cdk/core": "0.0.0", + "@aws-solutions-constructs/core": "0.0.0", + "@aws-solutions-constructs/resources": "0.0.0", + "constructs": "^3.2.0", + "@aws-cdk/aws-iam": "0.0.0" + }, + "keywords": [ + "aws", + "cdk", + "awscdk", + "AWS Solutions Constructs", + "Amazon API Gateway", + "AWS Lambda", + "OpenAPI" + ] +} diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json new file mode 100644 index 000000000..eb95766fb --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json @@ -0,0 +1,1013 @@ +{ + "Description": "Integration Test for aws-openapigateway-lambda", + "Resources": { + "LambdaFunctionServiceRole0C4CDE0B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "LambdaFunctionServiceRoleDefaultPolicy126C8897": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRoleDefaultPolicy126C8897", + "Roles": [ + { + "Ref": "LambdaFunctionServiceRole0C4CDE0B" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "LambdaFunctionBF21E41F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df.zip" + }, + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "LambdaFunctionServiceRoleDefaultPolicy126C8897", + "LambdaFunctionServiceRole0C4CDE0B" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "LambdaFunctionPermitAPIGInvocation805898E4": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "LambdaFunctionBF21E41F", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "PhotosLambdaTestFromAssetServiceRoleE0B4776B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "PhotosLambdaTestFromAssetServiceRoleDefaultPolicy240F3F29": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "PhotosLambdaTestFromAssetServiceRoleDefaultPolicy240F3F29", + "Roles": [ + { + "Ref": "PhotosLambdaTestFromAssetServiceRoleE0B4776B" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "PhotosLambdaTestFromAssetB776E3C5": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50.zip" + }, + "Role": { + "Fn::GetAtt": [ + "PhotosLambdaTestFromAssetServiceRoleE0B4776B", + "Arn" + ] + }, + "FunctionName": "PhotosLambdaTestFromAsset", + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "PhotosLambdaTestFromAssetServiceRoleDefaultPolicy240F3F29", + "PhotosLambdaTestFromAssetServiceRoleE0B4776B" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "PhotosLambdaTestFromAssetPermitAPIGInvocation323F8FF0": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "PhotosLambdaTestFromAssetB776E3C5", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Role used by the TemplateWriterLambda to transform the incoming asset", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "CloudWatchLogsPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "ReadInputAssetPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:PutObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "WriteOutputAssetPolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleDefaultPolicy5136571F": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleDefaultPolicy5136571F", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaFunctionC7227471": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014", + "Arn" + ] + }, + "Handler": "index.handler", + "MemorySize": 1024, + "Runtime": "nodejs18.x", + "Timeout": 60, + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleDefaultPolicy5136571F", + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1": { + "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" + ] + ] + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + ":*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventEF37D730": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", + "Arn" + ] + }, + "Description": "AWS CDK resource provider framework - onEvent (apiFromAssetExistingLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", + "Environment": { + "Variables": { + "USER_ON_EVENT_FUNCTION_ARN": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + } + } + }, + "Handler": "framework.onEvent", + "Runtime": "nodejs14.x", + "Timeout": 900 + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA", + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework has an IAM role with the arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Managed Policy attached, which grants permission to write to CloudWatch Logs" + }, + { + "id": "W89", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not access VPC resources" + }, + { + "id": "W92", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not define ReservedConcurrentExecutions" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4": { + "Type": "Custom::TemplateWriter", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventEF37D730", + "Arn" + ] + }, + "TemplateValues": { + "Fn::Join": [ + "", + [ + "{\"templateValues\":[{\"id\":\"MessagesHandler\",\"value\":\"arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "LambdaFunctionBF21E41F", + "Arn" + ] + }, + "/invocations\"},{\"id\":\"PhotosHandler\",\"value\":\"arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "PhotosLambdaTestFromAssetB776E3C5", + "Arn" + ] + }, + "/invocations\"}]}" + ] + ] + }, + "TemplateInputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "TemplateInputKey": "c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml", + "TemplateOutputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W86", + "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" + }, + { + "id": "W84", + "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" + } + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApi27C18064": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "BodyS3Location": { + "Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "Key": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4", + "TemplateOutputKey" + ] + } + }, + "Name": "SpecRestApi" + } + }, + "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775a5995a76cd028623a8c53fad4d5dfe6e": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "Description": "Automatically created by the RestApi construct" + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W45", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + } + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "AccessLogSetting": { + "DestinationArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC", + "Arn" + ] + }, + "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" + }, + "DeploymentId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775a5995a76cd028623a8c53fad4d5dfe6e" + }, + "MethodSettings": [ + { + "DataTraceEnabled": false, + "HttpMethod": "*", + "LoggingLevel": "INFO", + "ResourcePath": "/*" + } + ], + "StageName": "prod", + "TracingEnabled": true + } + }, + "OpenApiGatewayToLambdaSpecRestApiUsagePlan44F6F5C6": { + "Type": "AWS::ApiGateway::UsagePlan", + "Properties": { + "ApiStages": [ + { + "ApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "Stage": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + }, + "Throttle": {} + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "apigateway.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:DescribeLogGroups", + "logs:DescribeLogStreams", + "logs:PutLogEvents", + "logs:GetLogEvents", + "logs:FilterLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaRestApiCloudWatchRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaRestApiAccount71EC7DA6": { + "Type": "AWS::ApiGateway::Account", + "Properties": { + "CloudWatchRoleArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95", + "Arn" + ] + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaSpecRestApi27C18064" + ] + } + }, + "Outputs": { + "OpenApiGatewayToLambdaSpecRestApiEndpointD1FA5E3A": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + }, + "/" + ] + ] + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.ts new file mode 100644 index 000000000..ca666e92f --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.ts @@ -0,0 +1,61 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { App, Stack } from "aws-cdk-lib"; +import { OpenApiGatewayToLambda } from "../lib"; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as defaults from '@aws-solutions-constructs/core'; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as path from 'path'; + +const app = new App(); +const stack = new Stack(app, defaults.generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for aws-openapigateway-lambda'; + +const apiDefinitionAsset = new Asset(stack, 'ApiDefinitionAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') +}); + +const messagesLambda = defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } +}); + +const photosLambda = defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + functionName: 'PhotosLambdaTestFromAsset', + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/photos-lambda`), + } +}); + +new OpenApiGatewayToLambda(stack, 'OpenApiGatewayToLambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + existingLambdaObj: messagesLambda + }, + { + id: 'PhotosHandler', + existingLambdaObj: photosLambda + } + ] +}); + +// Synth +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json new file mode 100644 index 000000000..4b8ca836a --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json @@ -0,0 +1,1012 @@ +{ + "Description": "Integration Test for aws-openapigateway-lambda", + "Resources": { + "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction0260B7595": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B", + "Arn" + ] + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027", + "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction0PermitAPIGInvocation16ED06C4": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction0260B7595", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction1C23FE1AE": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60", + "Arn" + ] + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D", + "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction1PermitAPIGInvocation61F651CA": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction1C23FE1AE", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Role used by the TemplateWriterLambda to transform the incoming asset", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "CloudWatchLogsPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "ReadInputAssetPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:PutObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "WriteOutputAssetPolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleDefaultPolicy5136571F": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleDefaultPolicy5136571F", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaFunctionC7227471": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014", + "Arn" + ] + }, + "Handler": "index.handler", + "MemorySize": 1024, + "Runtime": "nodejs18.x", + "Timeout": 60, + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleDefaultPolicy5136571F", + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1": { + "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" + ] + ] + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + ":*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventEF37D730": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", + "Arn" + ] + }, + "Description": "AWS CDK resource provider framework - onEvent (apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", + "Environment": { + "Variables": { + "USER_ON_EVENT_FUNCTION_ARN": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + } + } + }, + "Handler": "framework.onEvent", + "Runtime": "nodejs14.x", + "Timeout": 900 + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA", + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework has an IAM role with the arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Managed Policy attached, which grants permission to write to CloudWatch Logs" + }, + { + "id": "W89", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not access VPC resources" + }, + { + "id": "W92", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not define ReservedConcurrentExecutions" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4": { + "Type": "Custom::TemplateWriter", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventEF37D730", + "Arn" + ] + }, + "TemplateValues": { + "Fn::Join": [ + "", + [ + "{\"templateValues\":[{\"id\":\"MessagesHandler\",\"value\":\"arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction0260B7595", + "Arn" + ] + }, + "/invocations\"},{\"id\":\"PhotosHandler\",\"value\":\"arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction1C23FE1AE", + "Arn" + ] + }, + "/invocations\"}]}" + ] + ] + }, + "TemplateInputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "TemplateInputKey": "c2b362b5f0d6d8f56ac2c011288aebd095499d839b130a932427f74232de2a32.yaml", + "TemplateOutputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W86", + "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" + }, + { + "id": "W84", + "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" + } + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApi27C18064": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "BodyS3Location": { + "Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "Key": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4", + "TemplateOutputKey" + ] + } + }, + "Name": "SpecRestApi" + } + }, + "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD077553ca81e8e1b2799986bf3d0ef9cf2ff0": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "Description": "Automatically created by the RestApi construct" + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W45", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + } + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "AccessLogSetting": { + "DestinationArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC", + "Arn" + ] + }, + "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" + }, + "DeploymentId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD077553ca81e8e1b2799986bf3d0ef9cf2ff0" + }, + "MethodSettings": [ + { + "DataTraceEnabled": false, + "HttpMethod": "*", + "LoggingLevel": "INFO", + "ResourcePath": "/*" + } + ], + "StageName": "prod", + "TracingEnabled": true + } + }, + "OpenApiGatewayToLambdaSpecRestApiUsagePlan44F6F5C6": { + "Type": "AWS::ApiGateway::UsagePlan", + "Properties": { + "ApiStages": [ + { + "ApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "Stage": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + }, + "Throttle": {} + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "apigateway.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:DescribeLogGroups", + "logs:DescribeLogStreams", + "logs:PutLogEvents", + "logs:GetLogEvents", + "logs:FilterLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaRestApiCloudWatchRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaRestApiAccount71EC7DA6": { + "Type": "AWS::ApiGateway::Account", + "Properties": { + "CloudWatchRoleArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95", + "Arn" + ] + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaSpecRestApi27C18064" + ] + } + }, + "Outputs": { + "OpenApiGatewayToLambdaSpecRestApiEndpointD1FA5E3A": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + }, + "/" + ] + ] + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.ts new file mode 100644 index 000000000..b4b2cb286 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.ts @@ -0,0 +1,52 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { App, Stack } from "aws-cdk-lib"; +import { OpenApiGatewayToLambda } from "../lib"; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as defaults from '@aws-solutions-constructs/core'; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as path from 'path'; + +const app = new App(); +const stack = new Stack(app, defaults.generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for aws-openapigateway-lambda'; + +const apiDefinitionAsset = new Asset(stack, 'ApiDefinitionAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') +}); + +new OpenApiGatewayToLambda(stack, 'OpenApiGatewayToLambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + }, + { + id: 'PhotosHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/photos-lambda`), + } + } + ] +}); + +// Synth +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json new file mode 100644 index 000000000..969f8c03d --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json @@ -0,0 +1,1012 @@ +{ + "Description": "Integration Test for aws-openapigateway-lambda", + "Resources": { + "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction0260B7595": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B", + "Arn" + ] + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027", + "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction0PermitAPIGInvocation16ED06C4": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction0260B7595", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction1C23FE1AE": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60", + "Arn" + ] + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D", + "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiFunction1PermitAPIGInvocation61F651CA": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction1C23FE1AE", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":execute-api:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "/*/*/*" + ] + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Role used by the TemplateWriterLambda to transform the incoming asset", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "CloudWatchLogsPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/8c48f41891550d16b8b5de60b76d4f7a2b045576775bc16e9b461062c830b50d.yaml" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "ReadInputAssetPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:PutObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "WriteOutputAssetPolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleDefaultPolicy5136571F": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleDefaultPolicy5136571F", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "OpenApiGatewayToLambdaLambdaFunctionServiceRoleACE09A85": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaFunctionC7227471": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014", + "Arn" + ] + }, + "Handler": "index.handler", + "MemorySize": 1024, + "Runtime": "nodejs18.x", + "Timeout": 60, + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleDefaultPolicy5136571F", + "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1": { + "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" + ] + ] + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + }, + ":*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA", + "Roles": [ + { + "Ref": "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + } + ] + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventEF37D730": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" + }, + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", + "Arn" + ] + }, + "Description": "AWS CDK resource provider framework - onEvent (apiFromAssetWithCognitoAuth/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", + "Environment": { + "Variables": { + "USER_ON_EVENT_FUNCTION_ARN": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaFunctionC7227471", + "Arn" + ] + } + } + }, + "Handler": "framework.onEvent", + "Runtime": "nodejs14.x", + "Timeout": 900 + }, + "DependsOn": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyB630DBDA", + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework has an IAM role with the arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Managed Policy attached, which grants permission to write to CloudWatch Logs" + }, + { + "id": "W89", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not access VPC resources" + }, + { + "id": "W92", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not define ReservedConcurrentExecutions" + } + ] + } + } + }, + "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4": { + "Type": "Custom::TemplateWriter", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventEF37D730", + "Arn" + ] + }, + "TemplateValues": { + "Fn::Join": [ + "", + [ + "{\"templateValues\":[{\"id\":\"MessagesHandler\",\"value\":\"arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction0260B7595", + "Arn" + ] + }, + "/invocations\"},{\"id\":\"PhotosHandler\",\"value\":\"arn:", + { + "Ref": "AWS::Partition" + }, + ":apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiFunction1C23FE1AE", + "Arn" + ] + }, + "/invocations\"}]}" + ] + ] + }, + "TemplateInputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "TemplateInputKey": "8c48f41891550d16b8b5de60b76d4f7a2b045576775bc16e9b461062c830b50d.yaml", + "TemplateOutputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W86", + "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" + }, + { + "id": "W84", + "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" + } + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApi27C18064": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "BodyS3Location": { + "Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "Key": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterCustomResource957D1BA4", + "TemplateOutputKey" + ] + } + }, + "Name": "SpecRestApi" + } + }, + "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775bcc848b868cc738d8dab6849b1e56a46": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "Description": "Automatically created by the RestApi construct" + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W45", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + } + ] + } + } + }, + "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "AccessLogSetting": { + "DestinationArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiAccessLogGroupE21284EC", + "Arn" + ] + }, + "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" + }, + "DeploymentId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775bcc848b868cc738d8dab6849b1e56a46" + }, + "MethodSettings": [ + { + "DataTraceEnabled": false, + "HttpMethod": "*", + "LoggingLevel": "INFO", + "ResourcePath": "/*" + } + ], + "StageName": "prod", + "TracingEnabled": true + } + }, + "OpenApiGatewayToLambdaSpecRestApiUsagePlan44F6F5C6": { + "Type": "AWS::ApiGateway::UsagePlan", + "Properties": { + "ApiStages": [ + { + "ApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + "Stage": { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + }, + "Throttle": {} + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "apigateway.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:DescribeLogGroups", + "logs:DescribeLogStreams", + "logs:PutLogEvents", + "logs:GetLogEvents", + "logs:FilterLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaRestApiCloudWatchRolePolicy" + } + ] + } + }, + "OpenApiGatewayToLambdaLambdaRestApiAccount71EC7DA6": { + "Type": "AWS::ApiGateway::Account", + "Properties": { + "CloudWatchRoleArn": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaLambdaRestApiCloudWatchRoleBC7E6D95", + "Arn" + ] + } + }, + "DependsOn": [ + "OpenApiGatewayToLambdaSpecRestApi27C18064" + ] + } + }, + "Outputs": { + "OpenApiGatewayToLambdaSpecRestApiEndpointD1FA5E3A": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, + ".execute-api.", + { + "Ref": "AWS::Region" + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB" + }, + "/" + ] + ] + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.ts new file mode 100644 index 000000000..5dcc800e2 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.ts @@ -0,0 +1,52 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { App, Stack } from "aws-cdk-lib"; +import { OpenApiGatewayToLambda } from "../lib"; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as defaults from '@aws-solutions-constructs/core'; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as path from 'path'; + +const app = new App(); +const stack = new Stack(app, defaults.generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for aws-openapigateway-lambda'; + +const apiDefinitionAsset = new Asset(stack, 'ApiDefinitionAsset', { + path: path.join(__dirname, 'openapi/apiDefinition-withCognitoAuth.yaml') +}); + +new OpenApiGatewayToLambda(stack, 'OpenApiGatewayToLambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + }, + { + id: 'PhotosHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/photos-lambda`), + } + } + ] +}); + +// Synth +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/messages-lambda/index.mjs b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/messages-lambda/index.mjs new file mode 100644 index 000000000..dfcaf1052 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/messages-lambda/index.mjs @@ -0,0 +1,16 @@ +export const handler = async (event) => { + switch (event.httpMethod) { + case 'POST': + return { + statusCode: 200, + body: JSON.stringify({"message": "successfully handled POST from messages lambda"}) + }; + case 'GET': + return { + statusCode: 200, + body: JSON.stringify({"message": "successfully handled GET from messages lambda"}) + }; + default: + throw new Error(`cannot handle httpMethod: ${event.httpMethod}`); + } +}; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/openapi/apiDefinition-withCognitoAuth.yaml b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/openapi/apiDefinition-withCognitoAuth.yaml new file mode 100644 index 000000000..e56c7cc14 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/openapi/apiDefinition-withCognitoAuth.yaml @@ -0,0 +1,50 @@ +openapi: "3.0.1" +info: + title: "api" + version: "2023-02-20T20:46:08Z" +components: + securitySchemes: + CognitoAuthorizer: + type: apiKey + name: Authorization + in: header + x-amazon-apigateway-authtype: cognito_user_pools + x-amazon-apigateway-authorizer: + type: cognito_user_pools + providerARNs: + - arn:aws:cognito-idp:us-west-2:000000000000:userpool/us-west-2_aaaaa1111 +paths: + /messages: + get: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: MessagesHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + security: + - CognitoAuthorizer: [] + post: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: MessagesHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + security: + - CognitoAuthorizer: [] + /photos: + get: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: PhotosHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + security: + - CognitoAuthorizer: [] + post: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: PhotosHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + security: + - CognitoAuthorizer: [] \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/openapi/apiDefinition.yaml b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/openapi/apiDefinition.yaml new file mode 100644 index 000000000..b60599592 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/openapi/apiDefinition.yaml @@ -0,0 +1,39 @@ +openapi: "3.0.1" +info: + title: "api" + version: "2023-02-20T20:46:08Z" +paths: + /messages: + get: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: MessagesHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + x-amazon-apigateway-auth: + type: "AWS_IAM" + post: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: MessagesHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + x-amazon-apigateway-auth: + type: "AWS_IAM" + /photos: + get: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: PhotosHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + x-amazon-apigateway-auth: + type: "AWS_IAM" + post: + x-amazon-apigateway-integration: + httpMethod: "POST" + uri: PhotosHandler + passthroughBehavior: "when_no_match" + type: "aws_proxy" + x-amazon-apigateway-auth: + type: "AWS_IAM" \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/photos-lambda/index.mjs b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/photos-lambda/index.mjs new file mode 100644 index 000000000..220496109 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/photos-lambda/index.mjs @@ -0,0 +1,16 @@ +export const handler = async (event) => { + switch (event.httpMethod) { + case 'POST': + return { + statusCode: 200, + body: JSON.stringify({"message": "successfully handled POST from photos lambda"}) + }; + case 'GET': + return { + statusCode: 200, + body: JSON.stringify({"message": "successfully handled GET from photos lambda"}) + }; + default: + throw new Error(`cannot handle httpMethod: ${event.httpMethod}`); + } +}; diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts new file mode 100644 index 000000000..1280927b7 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts @@ -0,0 +1,321 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +// Imports +import { Stack } from "aws-cdk-lib"; +import { OpenApiGatewayToLambda } from "../lib"; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as s3 from 'aws-cdk-lib/aws-s3'; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as path from 'path'; +import { Template } from "aws-cdk-lib/assertions"; +import { CreateScrapBucket } from "@aws-solutions-constructs/core"; + +test('Simple deployment works', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + const construct = new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + } + ] + }); + + expect(construct.apiGateway).toBeDefined(); + expect(construct.apiGatewayCloudWatchRole).toBeDefined(); + expect(construct.apiGatewayLogGroup).toBeDefined(); + expect(construct.apiLambdaFunctions.length).toEqual(1); + expect(construct.apiLambdaFunctions[0].id).toEqual('MessagesHandler'); + expect(construct.apiLambdaFunctions[0].lambdaFunction).toBeDefined(); +}); + +test('API Definition can be specified from Asset', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + const construct = new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + } + ] + }); + + expect(construct.apiLambdaFunctions[0].id).toEqual('MessagesHandler'); + expect(construct.apiLambdaFunctions[0].lambdaFunction).toBeDefined(); +}); + +test('API Definition can be specified from S3 Bucket and Key', () => { + const stack = new Stack(); + + const apiDefinitionBucket = CreateScrapBucket(stack, {}); + const apiDefinitionKey = 'api.yaml'; + + const construct = new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionBucket, + apiDefinitionKey, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + } + ] + }); + + expect(construct.apiLambdaFunctions[0].id).toEqual('MessagesHandler'); + expect(construct.apiLambdaFunctions[0].lambdaFunction).toBeDefined(); +}); + +test('Throws error when both api definition asset and s3 object are specified', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + const app = () => { + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiDefinitionBucket: new s3.Bucket(stack, 'ApiDefinitionBucket'), + apiDefinitionKey: 'key', + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + } + ] + }); + }; + expect(app).toThrowError('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified, but not both'); +}); + +test('Multiple Lambda Functions can be specified', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + }, { + id: 'PhotosHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/photos-lambda`), + } + } + ] + }); + + const template = Template.fromStack(stack); + template.resourceCountIs('AWS::Lambda::Function', 4); +}); + +test('Existing lambda function can be specified', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + const existingLambdaObj = new lambda.Function(stack, 'ExistingLambda', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + functionName: 'ExistingLambdaFunction', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + }); + + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + existingLambdaObj + }, { + id: 'PhotosHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + functionName: 'NewLambdaFunction', + code: lambda.Code.fromAsset(`${__dirname}/photos-lambda`), + } + } + ] + }); + + const template = Template.fromStack(stack); + template.resourceCountIs('AWS::Lambda::Function', 4); + + template.hasResourceProperties("AWS::Lambda::Function", { + FunctionName: 'ExistingLambdaFunction' + }); + + template.hasResourceProperties("AWS::Lambda::Function", { + FunctionName: 'NewLambdaFunction' + }); +}); + +test('Throws error when neither existingLambdaObj or lambdaFunctionProps is specified', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + const app = () => { + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler' + } + ] + }); + }; + expect(app).toThrowError('One of existingLambdaObj or lambdaFunctionProps must be specified for the api integration with id: MessagesHandler'); +}); + +test('Throws error when no api definition is specified', () => { + const stack = new Stack(); + + const app = () => { + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + } + ] + }); + }; + expect(app).toThrowError('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified'); +}); + +test('Throws error when no api integration is specified', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + const app = () => { + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiIntegrations: [] + }); + }; + expect(app).toThrowError('At least one ApiIntegration must be specified in the apiIntegrations property'); +}); + +test('Throws error when api definition s3 bucket is specified but s3 object key is missing', () => { + const stack = new Stack(); + + const apiDefinitionBucket = CreateScrapBucket(stack, {}); + + const app = () => { + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionBucket, + apiIntegrations: [] + }); + }; + expect(app).toThrowError('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified'); +}); + +test('Throws error when api definition s3 object key is specified but s3 bucket is missing', () => { + const stack = new Stack(); + + const app = () => { + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionKey: 'prefix/api-definition.yml', + apiIntegrations: [] + }); + }; + expect(app).toThrowError('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified'); +}); + +test('Throws error when api is defined as asset and s3 bucket is specified', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + const apiDefinitionBucket = CreateScrapBucket(stack, {}); + + const app = () => { + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiDefinitionBucket, + apiIntegrations: [] + }); + }; + expect(app).toThrowError('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified'); +}); + +test('Throws error when api is defined as asset and s3 key is specified', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + const app = () => { + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiDefinitionKey: 'prefix/api-definition.yml', + apiIntegrations: [] + }); + }; + expect(app).toThrowError('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified'); +}); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-defaults.ts index f3b3cac32..02589b41d 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-defaults.ts @@ -104,6 +104,25 @@ export function DefaultRegionalRestApiProps(_logGroup: LogGroup) { return DefaultRestApiProps([api.EndpointType.REGIONAL], _logGroup); } +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + * + * Provides the default set of properties for SpecRestApi + * @param logGroup - CloudWatch Log Group for Api Gateway Access Logging + */ +export function DefaultSpecRestApiProps(logGroup: LogGroup): api.RestApiBaseProps { + return { + cloudWatchRole: false, + deployOptions: { + accessLogDestination: new api.LogGroupLogDestination(logGroup), + accessLogFormat: api.AccessLogFormat.jsonWithStandardFields(), + loggingLevel: api.MethodLoggingLevel.INFO, + dataTraceEnabled: false, + tracingEnabled: true + } + }; +} + /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. * diff --git a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts index bffd0d628..5a98ed63e 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts @@ -34,7 +34,7 @@ import { Construct } from 'constructs'; * @param scope - the construct to which the access logging capabilities should be attached to. * @param api - an existing api.RestApi or api.LambdaRestApi. */ -function configureCloudwatchRoleForApi(scope: Construct, api: apigateway.RestApi): iam.Role { +function configureCloudwatchRoleForApi(scope: Construct, api: apigateway.RestApiBase): iam.Role { // Setup the IAM Role for API Gateway CloudWatch access const restApiCloudwatchRole = new iam.Role(scope, 'LambdaRestApiCloudWatchRole', { assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'), @@ -272,6 +272,41 @@ export function RegionalRestApi(scope: Construct, apiGatewayProps?: apigateway.R return { api: configureRestApiResponse.api, role: configureRestApiResponse.role, logGroup }; } +export interface CreateSpecRestApiResponse { + readonly api: apigateway.SpecRestApi, + readonly role?: iam.Role, + readonly logGroup: logs.LogGroup, +} + +export function CreateSpecRestApi( + scope: Construct, + apiGatewayProps: apigateway.SpecRestApiProps, + logGroupProps?: logs.LogGroupProps): CreateSpecRestApiResponse { + + const logGroup = buildLogGroup(scope, 'ApiAccessLogGroup', logGroupProps); + const defaultProps = apiDefaults.DefaultSpecRestApiProps(logGroup); + + // Define the API object + let api: apigateway.SpecRestApi; + // If property overrides have been provided, incorporate them and deploy + const consolidatedApiGatewayProps = consolidateProps(defaultProps, apiGatewayProps, { cloudWatchRole: false }); + api = new apigateway.SpecRestApi(scope, 'SpecRestApi', consolidatedApiGatewayProps); + // Configure API access logging + const cwRole = (apiGatewayProps?.cloudWatchRole !== false) ? configureCloudwatchRoleForApi(scope, api) : undefined; + + // Configure Usage Plan + const usagePlanProps: apigateway.UsagePlanProps = { + apiStages: [{ + api, + stage: api.deploymentStage + }] + }; + + api.addUsagePlan('UsagePlan', usagePlanProps); + + return { api, role: cwRole, logGroup}; +} + export interface AddProxyMethodToApiResourceInputParams { readonly service: string, readonly action?: string, diff --git a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts index 2aa22e631..fc2f88838 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts @@ -50,11 +50,14 @@ export interface BuildLambdaFunctionProps { /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ -export function buildLambdaFunction(scope: Construct, props: BuildLambdaFunctionProps): lambda.Function { +export function buildLambdaFunction(scope: Construct, props: BuildLambdaFunctionProps, constructId?: string): lambda.Function { // Conditional lambda function creation if (!props.existingLambdaObj) { if (props.lambdaFunctionProps) { - return deployLambdaFunction(scope, props.lambdaFunctionProps, props.lambdaFunctionProps.functionName, props.vpc); + // constructId may be specified by the calling code, but if not, fallback to the original behavior of using the + // function name as the construct id used when creating the underlying lambda function and iam role. + constructId = constructId ?? props.lambdaFunctionProps.functionName; + return deployLambdaFunction(scope, props.lambdaFunctionProps, constructId, props.vpc); } else { throw Error('Either existingLambdaObj or lambdaFunctionProps is required'); } @@ -81,11 +84,11 @@ export function buildLambdaFunction(scope: Construct, props: BuildLambdaFunction */ export function deployLambdaFunction(scope: Construct, lambdaFunctionProps: lambda.FunctionProps, - functionId?: string, + constructId?: string, vpc?: ec2.IVpc): lambda.Function { - const _functionId = functionId ? functionId : 'LambdaFunction'; - const _functionRoleId = _functionId + 'ServiceRole'; + const functionId = constructId ?? 'LambdaFunction'; + const functionRoleId = functionId + 'ServiceRole'; if (vpc && lambdaFunctionProps.vpc) { throw new Error( @@ -94,7 +97,7 @@ export function deployLambdaFunction(scope: Construct, } // Setup the IAM Role for Lambda Service - const lambdaServiceRole = new iam.Role(scope, _functionRoleId, { + const lambdaServiceRole = new iam.Role(scope, functionRoleId, { assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), inlinePolicies: { LambdaFunctionServiceRolePolicy: new iam.PolicyDocument({ @@ -149,7 +152,7 @@ export function deployLambdaFunction(scope: Construct, }, true); } - const lambdafunction = new lambda.Function(scope, _functionId, finalLambdaFunctionProps); + const lambdafunction = new lambda.Function(scope, functionId, finalLambdaFunctionProps); if (lambdaFunctionProps.runtime === lambda.Runtime.NODEJS_16_X) { lambdafunction.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true }); diff --git a/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts index ab08fde1a..99b0c6d99 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts @@ -485,3 +485,79 @@ test('test buildLambdaFunction with lambdaFunctionProps custom id', () => { }, }); }); + +test('buildLambdaFunction uses constructId when specified', () => { + const stack = new Stack(); + + defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + } + }, 'MyConstructId'); + + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { + Role: { + 'Fn::GetAtt': ['MyConstructIdServiceRole271C08FC', 'Arn'], + }, + }); +}); + +// specifying constructId takes precendence over functionName for setting the +// underlying lambda function and iam role construct ids. +test('buildLambdaFunction uses constructId when both constructId and functionName are specified', () => { + const stack = new Stack(); + + defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + functionName: 'MyTestFunction', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + } + }, 'MyConstructId'); + + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { + Role: { + 'Fn::GetAtt': ['MyConstructIdServiceRole271C08FC', 'Arn'], + }, + }); +}); + +test('buildLambdaFunction uses functionName when constructId is not specified', () => { + const stack = new Stack(); + + defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + functionName: 'MyTestFunction', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + } + }); + + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { + Role: { + 'Fn::GetAtt': ['MyTestFunctionServiceRole37517223', 'Arn'], + }, + }); +}); + +test('buildLambdaFunction uses default name when neither constructId or functionName is specified', () => { + const stack = new Stack(); + + defaults.buildLambdaFunction(stack, { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + } + }); + + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { + Role: { + 'Fn::GetAtt': ['LambdaFunctionServiceRole0C4CDE0B', 'Arn'], + }, + }); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/test-helper.ts b/source/patterns/@aws-solutions-constructs/core/test/test-helper.ts index 8573221a6..cf1ca2f85 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/test-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/test-helper.ts @@ -12,9 +12,9 @@ */ // Imports -import { Construct } from 'constructs'; +import { Construct, IConstruct } from 'constructs'; import { Bucket, BucketProps, BucketEncryption } from "aws-cdk-lib/aws-s3"; -import { RemovalPolicy, Stack } from "aws-cdk-lib"; +import { CfnResource, RemovalPolicy, Stack, Aspects, IAspect } from "aws-cdk-lib"; import { buildVpc } from '../lib/vpc-helper'; import { DefaultPublicPrivateVpcProps, DefaultIsolatedVpcProps } from '../lib/vpc-defaults'; import { overrideProps, addCfnSuppressRules } from "../lib/utils"; @@ -106,7 +106,7 @@ export function getFakeCertificate(scope: Construct, id: string): acm.ICertifica } export function suppressAutoDeleteHandlerWarnings(stack: Stack) { - Stack.of(stack).node.children.forEach(child => { + stack.node.children.forEach(child => { if (child.node.id === 'Custom::S3AutoDeleteObjectsCustomResourceProvider') { const handlerFunction = child.node.findChild('Handler') as CfnFunction; addCfnSuppressRules(handlerFunction, [{ id: "W58", reason: "CDK generated custom resource"}]); @@ -114,7 +114,6 @@ export function suppressAutoDeleteHandlerWarnings(stack: Stack) { addCfnSuppressRules(handlerFunction, [{ id: "W92", reason: "CDK generated custom resource"}]); } }); - } export function CreateTestCache(scope: Construct, id: string, vpc: ec2.IVpc, port?: number) { @@ -180,3 +179,26 @@ export function expectNonexistence(stack: Stack, type: string, props: object) { const shouldFindNothing = Template.fromStack(stack).findResources(type, props); expect(Object.keys(shouldFindNothing).length).toEqual(0); } + +// private helper class to suppress the standard cfn nag warnings for lambda functions used in integ tests +class CfnNagLambdaAspect implements IAspect { + public visit(node: IConstruct): void { + const resource = node as CfnResource; + if (resource.cfnResourceType === 'AWS::Lambda::Function') { + addCfnSuppressRules(resource, [ + { id: 'W58', reason: 'This Lambda Function is created for integration testing purposes only and is not part of an actual construct' }, + { id: 'W89', reason: 'This Lambda Function is created for integration testing purposes only and is not part of an actual construct' }, + { id: 'W92', reason: 'This Lambda Function is created for integration testing purposes only and is not part of an actual construct' } + ]); + } + } +} + +/** + * Used to suppress cfn nag W58, W89, and W92 rules on lambda integration test resources. + * + * @param stack - The stack to suppress cfn nag lambda rules on + */ +export function SuppressCfnNagLambdaWarnings(stack: Stack) { + Aspects.of(stack).add(new CfnNagLambdaAspect()); +} diff --git a/source/patterns/@aws-solutions-constructs/resources/.eslintignore b/source/patterns/@aws-solutions-constructs/resources/.eslintignore new file mode 100644 index 000000000..06bf256b8 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/.eslintignore @@ -0,0 +1,5 @@ +index.js +lib/*.js +test/*.js +*.d.ts +coverage \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/.gitignore b/source/patterns/@aws-solutions-constructs/resources/.gitignore new file mode 100644 index 000000000..f4b17fa0b --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/.gitignore @@ -0,0 +1,17 @@ +index.js +lib/*.js +test/*.js +!test/lambda*/* +*.js.map +*.d.ts +node_modules +*.generated.ts +dist +.jsii + +.LAST_BUILD +.nyc_output +coverage +.nycrc +.LAST_PACKAGE +*.snk \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/.npmignore b/source/patterns/@aws-solutions-constructs/resources/.npmignore new file mode 100644 index 000000000..f66791629 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/.npmignore @@ -0,0 +1,21 @@ +# Exclude typescript source and config +*.ts +tsconfig.json +coverage +.nyc_output +*.tgz +*.snk +*.tsbuildinfo + +# Include javascript files and typescript declarations +!*.js +!*.d.ts + +# Exclude jsii outdir +dist + +# Include .jsii +!.jsii + +# Include .jsii +!.jsii \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/README.md b/source/patterns/@aws-solutions-constructs/resources/README.md new file mode 100644 index 000000000..04bc21a96 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/README.md @@ -0,0 +1,21 @@ +# resources module + + +--- + +![Stability: Experimental](https://img.shields.io/badge/stability-Experimental-important.svg?style=for-the-badge) + +> All classes are under active development and subject to non-backward compatible changes or removal in any +> future version. These are not subject to the [Semantic Versioning](https://semver.org/) model. +> This means that while you may use them, you may need to update your source code when upgrading to a newer version of this package. + +--- + + +| **Reference Documentation**:| https://docs.aws.amazon.com/solutions/latest/constructs/| +|:-------------|:-------------| +
+ +The resources library contains resuable resources that can be leveraged from solutions constructs. These resources are deployable units with their own sets of integration tests (to contrast them with the solutions constructs `core` library). + +The first resource being published is the `template-writer`, which does automatic text transformation/substiution, implemented as a custom resource, and run as part of a CloudFormation stack Create/Update/Delete lifecycle. Some use-cases for using the `template-writer` resource can be seen in the `aws-openapigateway-lambda` Solutions Construct, where it transforms an incoming OpenAPI Definition (residing locally or in S3) by auto-populating the `uri` fields of the `x-amazon-apigateway-integration` integrations with the resolved value of the backing lambda functions. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/index.ts b/source/patterns/@aws-solutions-constructs/resources/index.ts new file mode 100644 index 000000000..46e157f5e --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/index.ts @@ -0,0 +1,14 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +export * from './lib/template-writer'; \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/lib/placeholder b/source/patterns/@aws-solutions-constructs/resources/lib/placeholder new file mode 100644 index 000000000..2ffcefdfb --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/lib/placeholder @@ -0,0 +1,3 @@ +DO-NOT-DELETE + +This file is used to create an aws_s3_assets.Asset that will be referenced when writing the transformed asset. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/lib/template-writer-custom-resource/index.mjs b/source/patterns/@aws-solutions-constructs/resources/lib/template-writer-custom-resource/index.mjs new file mode 100644 index 000000000..3e5be7940 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/lib/template-writer-custom-resource/index.mjs @@ -0,0 +1,73 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { S3Client, GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3"; +import * as crypto from 'crypto'; + +const s3Client = new S3Client({ region: process.env.REGION }); + +export const handler = async (event, context) => { + let status = 'SUCCESS'; + let responseData = {}; + + // These are the standard Create/Update/Delete custom resource request types defined here: + // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-requesttypes.html + if (event.RequestType === 'Create' || event.RequestType === 'Update') { + try { + const templateValues = JSON.parse(event.ResourceProperties.TemplateValues).templateValues; + const templateInputBucket = event.ResourceProperties.TemplateInputBucket; + const templateInputKey = event.ResourceProperties.TemplateInputKey; + const templateOutputBucket = event.ResourceProperties.TemplateOutputBucket; + const templateOutputKey = crypto.randomBytes(32).toString('hex'); + + const getObjectResponse = await s3Client.send(new GetObjectCommand({ + Bucket: templateInputBucket, + Key: templateInputKey + })); + + let template = await getObjectResponse.Body?.transformToString(); + + templateValues.forEach(templateValue => { + template = template?.replace( + new RegExp(templateValue.id, 'g'), + templateValue.value + ); + }); + + await s3Client.send(new PutObjectCommand({ + Bucket: templateOutputBucket, + Key: templateOutputKey, + Body: template + })); + + responseData = { + TemplateOutputKey: templateOutputKey + }; + } catch (err) { + status = 'FAILED'; + responseData = { + Error: err + }; + } + } + + return { + Status: status, + Reason: JSON.stringify(responseData), + PhysicalResourceId: event.PhysicalResourceId ?? context.logStreamName, + StackId: event.StackId, + RequestId: event.RequestId, + LogicalResourceId: event.LogicalResourceId, + Data: responseData, + }; +}; \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/lib/template-writer.ts b/source/patterns/@aws-solutions-constructs/resources/lib/template-writer.ts new file mode 100644 index 000000000..c899e6b08 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/lib/template-writer.ts @@ -0,0 +1,179 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { Construct } from "constructs"; +import * as cdk from "aws-cdk-lib"; +import * as iam from 'aws-cdk-lib/aws-iam'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as s3 from 'aws-cdk-lib/aws-s3'; +import { Aws, CustomResource } from 'aws-cdk-lib'; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as path from 'path'; +import { Provider } from "aws-cdk-lib/custom-resources"; +import { addCfnSuppressRules, buildLambdaFunction } from "@aws-solutions-constructs/core"; + +/** + * The TemplateValue interface defines the id-value pair that will + * be substituted in the template. + * + * For example, given the template: + * template: + * hello name_placeholder, nice to meet you + * + * and an instantiation of TemplateValue { id: 'name_placeholder', value: 'jeff' } + * + * the template will be transformed to: + * template: + * hello jeff, nice to meet you + */ +export interface TemplateValue { + /** + * The placeholder string to be replaced in the template. + */ + readonly id: string; + /** + * The value to replace the placeholder in the template with. + */ + readonly value: string; +} + +export interface TemplateWriterProps { + /** + * The S3 bucket that holds the template to transform. + * Upstream this can come either from an Asset or S3 bucket directly. + * Internally it will always resolve to S3 bucket in either case (the cdk asset bucket or the customer-defined bucket). + */ + readonly templateBucket: s3.IBucket; + /** + * The S3 object key of the template to transform. + */ + readonly templateKey: string; + /** + * An array of TemplateValue objects, each defining a placeholder string in the + * template that will be replaced with its corresponding value. + */ + readonly templateValues: TemplateValue[] + /** + * Optional configuration for user-defined duration of the backing Lambda function, which may be necessary when transforming very large objects. + * + * @default Duration.seconds(3) + */ + readonly timeout?: cdk.Duration; + /** + * Optional configuration for user-defined memorySize of the backing Lambda function, which may be necessary when transforming very large objects. + * + * @default 128 + */ + readonly memorySize?: number; +} + +export interface CreateTemplateWriterResponse { + readonly s3Bucket: s3.IBucket; + readonly s3Key: string; + readonly customResource: CustomResource; +} + +export function createTemplateWriterCustomResource( + scope: Construct, + id: string, + props: TemplateWriterProps +): CreateTemplateWriterResponse { + + const outputAsset = new Asset(scope, `${id}OutputAsset`, { + path: path.join(__dirname, 'placeholder') + }); + + const templateWriterLambda = buildLambdaFunction(scope, { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/template-writer-custom-resource`), + timeout: props.timeout, + memorySize: props.memorySize, + role: new iam.Role(scope, `${id}TemplateWriterLambdaRole`, { + assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), + description: 'Role used by the TemplateWriterLambda to transform the incoming asset', + inlinePolicies: { + CloudWatchLogsPolicy: new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + actions: [ + 'logs:CreateLogGroup', + 'logs:CreateLogStream', + 'logs:PutLogEvents' + ], + resources: [ `arn:${Aws.PARTITION}:logs:${Aws.REGION}:${Aws.ACCOUNT_ID}:log-group:/aws/lambda/*` ] + }) + ] + }), + ReadInputAssetPolicy: new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + actions: [ 's3:GetObject' ], + effect: iam.Effect.ALLOW, + resources: [ `arn:${Aws.PARTITION}:s3:::${props.templateBucket.bucketName}/${props.templateKey}`] + }) + ] + }), + WriteOutputAssetPolicy: new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + actions: [ 's3:PutObject' ], + effect: iam.Effect.ALLOW, + resources: [ `arn:${Aws.PARTITION}:s3:::${outputAsset.s3BucketName}/*`] + }) + ] + }) + } + }) + } + }); + + const templateWriterProvider = new Provider(scope, `${id}TemplateWriterProvider`, { + onEventHandler: templateWriterLambda + }); + + const providerFrameworkFunction = templateWriterProvider.node.children[0].node.findChild('Resource') as lambda.CfnFunction; + + addCfnSuppressRules(providerFrameworkFunction, [ + { + id: 'W58', + reason: `The CDK-provided lambda function that backs their Custom Resource Provider framework has an IAM role with the arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Managed Policy attached, which grants permission to write to CloudWatch Logs` + }, + { + id: 'W89', + reason: `The CDK-provided lambda function that backs their Custom Resource Provider framework does not access VPC resources` + }, + { + id: 'W92', + reason: `The CDK-provided lambda function that backs their Custom Resource Provider framework does not define ReservedConcurrentExecutions` + } + ]); + + const customResource = new CustomResource(scope, `${id}TemplateWriterCustomResource`, { + resourceType: 'Custom::TemplateWriter', + serviceToken: templateWriterProvider.serviceToken, + properties: { + TemplateValues: JSON.stringify({ templateValues: props.templateValues }), + TemplateInputBucket: props.templateBucket.bucketName, + TemplateInputKey: props.templateKey, + TemplateOutputBucket: outputAsset.s3BucketName + } + }); + + return { + s3Bucket: outputAsset.bucket, + s3Key: customResource.getAttString('TemplateOutputKey'), + customResource + }; +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/package.json b/source/patterns/@aws-solutions-constructs/resources/package.json new file mode 100644 index 000000000..137ee67b8 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/package.json @@ -0,0 +1,82 @@ +{ + "name": "@aws-solutions-constructs/resources", + "version": "0.0.0", + "description": "Resource CDK Constructs for patterns library", + "main": "index.js", + "types": "index.ts", + "repository": { + "type": "git", + "url": "https://github.com/awslabs/aws-solutions-constructs.git", + "directory": "source/patterns/@aws-solutions-constructs/resources" + }, + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com", + "organization": true + }, + "license": "Apache-2.0", + "scripts": { + "build": "tsc -b .", + "lint": "eslint -c ../eslintrc.yml --ext=.js,.ts . && tslint --project .", + "lint-fix": "eslint -c ../eslintrc.yml --ext=.js,.ts --fix .", + "test": "jest --coverage", + "clean": "tsc -b --clean", + "watch": "tsc -b -w", + "integ": "cdk-integ", + "integ-assert": "cdk-integ-assert-v2", + "jsii": "jsii", + "jsii-pacmak": "jsii-pacmak", + "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", + "snapshot-update": "npm test -- -u" + }, + "jsii": { + "outdir": "dist", + "targets": { + "java": { + "package": "software.amazon.awsconstructs.services.resources", + "maven": { + "groupId": "software.amazon.awsconstructs", + "artifactId": "resources" + } + }, + "dotnet": { + "namespace": "Amazon.SolutionsConstructs.AWS.Resources", + "packageId": "Amazon.SolutionsConstructs.AWS.Resources", + "signAssembly": true, + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png" + }, + "python": { + "distName": "aws-solutions-constructs.resources", + "module": "aws_solutions_constructs.resources" + } + } + }, + "dependencies": { + "@aws-solutions-constructs/core": "0.0.0" + }, + "devDependencies": { + "@types/jest": "^27.4.0", + "@types/node": "^10.3.0", + "aws-cdk-lib": "0.0.0", + "constructs": "^10.0.0" + }, + "jest": { + "moduleFileExtensions": [ + "js" + ], + "coverageReporters": [ + "text", + [ + "lcov", + { + "projectRoot": "../../../../" + } + ] + ] + }, + "peerDependencies": { + "@aws-solutions-constructs/core": "0.0.0", + "aws-cdk-lib": "^0.0.0", + "constructs": "^10.0.0" + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.expected.json b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.expected.json new file mode 100644 index 000000000..2d452a073 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.expected.json @@ -0,0 +1,431 @@ +{ + "Description": "Integration Test for Template Writer Resource", + "Resources": { + "TestTemplateWriterLambdaRole192FE23A": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Role used by the TemplateWriterLambda to transform the incoming asset", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "CloudWatchLogsPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/97cd237b0ae069fe0711bcc6a711e213fdaf0956421de5b964de9ccd0d2b23a1.97cd237b0ae069fe0711bcc6a711e213fdaf0956421de5b964de9ccd0d2b23a1" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "ReadInputAssetPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:PutObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "WriteOutputAssetPolicy" + } + ] + } + }, + "TestTemplateWriterLambdaRoleDefaultPolicyBCFD88FC": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "TestTemplateWriterLambdaRoleDefaultPolicyBCFD88FC", + "Roles": [ + { + "Ref": "TestTemplateWriterLambdaRole192FE23A" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "LambdaFunctionServiceRole0C4CDE0B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "LambdaFunctionBF21E41F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" + }, + "Role": { + "Fn::GetAtt": [ + "TestTemplateWriterLambdaRole192FE23A", + "Arn" + ] + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "TestTemplateWriterLambdaRoleDefaultPolicyBCFD88FC", + "TestTemplateWriterLambdaRole192FE23A" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A": { + "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" + ] + ] + } + ] + } + }, + "TestTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicy08B90D53": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "LambdaFunctionBF21E41F", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "LambdaFunctionBF21E41F", + "Arn" + ] + }, + ":*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "TestTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicy08B90D53", + "Roles": [ + { + "Ref": "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A" + } + ] + } + }, + "TestTemplateWriterProviderframeworkonEvent7FDD3553": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" + }, + "Role": { + "Fn::GetAtt": [ + "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A", + "Arn" + ] + }, + "Description": "AWS CDK resource provider framework - onEvent (template-writer-from-asset/TestTemplateWriterProvider)", + "Environment": { + "Variables": { + "USER_ON_EVENT_FUNCTION_ARN": { + "Fn::GetAtt": [ + "LambdaFunctionBF21E41F", + "Arn" + ] + } + } + }, + "Handler": "framework.onEvent", + "Runtime": "nodejs14.x", + "Timeout": 900 + }, + "DependsOn": [ + "TestTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicy08B90D53", + "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework has an IAM role with the arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Managed Policy attached, which grants permission to write to CloudWatch Logs" + }, + { + "id": "W89", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not access VPC resources" + }, + { + "id": "W92", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not define ReservedConcurrentExecutions" + } + ] + } + } + }, + "TestTemplateWriterCustomResource": { + "Type": "Custom::TemplateWriter", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "TestTemplateWriterProviderframeworkonEvent7FDD3553", + "Arn" + ] + }, + "TemplateValues": "{\"templateValues\":[{\"id\":\"placeholder\",\"value\":\"resolved_value\"}]}", + "TemplateInputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "TemplateInputKey": "97cd237b0ae069fe0711bcc6a711e213fdaf0956421de5b964de9ccd0d2b23a1.97cd237b0ae069fe0711bcc6a711e213fdaf0956421de5b964de9ccd0d2b23a1", + "TemplateOutputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.ts b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.ts new file mode 100644 index 000000000..e0957d40a --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.ts @@ -0,0 +1,41 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { App, Stack } from "aws-cdk-lib"; +import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as path from 'path'; +import { TemplateValue, createTemplateWriterCustomResource } from "../lib/template-writer"; + +const app = new App(); +const stack = new Stack(app, generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for Template Writer Resource'; + +const templateAsset = new Asset(stack, 'TemplateAsset', { + path: path.join(__dirname, 'template/sample-template') +}); + +const templateValues: TemplateValue[] = new Array( + { + id: 'placeholder', + value: 'resolved_value' + } +); + +createTemplateWriterCustomResource(stack, 'Test', { + templateBucket: templateAsset.bucket, + templateKey: templateAsset.s3ObjectKey, + templateValues +}); + +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.expected.json b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.expected.json new file mode 100644 index 000000000..706be9649 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.expected.json @@ -0,0 +1,433 @@ +{ + "Description": "Integration Test for Template Writer Resource", + "Resources": { + "TestTemplateWriterLambdaRole192FE23A": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Role used by the TemplateWriterLambda to transform the incoming asset", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "CloudWatchLogsPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/122da676fba68619def0d539ff80855eaa0ba3686fb37faa298ce277c4feb8f8.122da676fba68619def0d539ff80855eaa0ba3686fb37faa298ce277c4feb8f8" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "ReadInputAssetPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:PutObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "WriteOutputAssetPolicy" + } + ] + } + }, + "TestTemplateWriterLambdaRoleDefaultPolicyBCFD88FC": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "TestTemplateWriterLambdaRoleDefaultPolicyBCFD88FC", + "Roles": [ + { + "Ref": "TestTemplateWriterLambdaRole192FE23A" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "LambdaFunctionServiceRole0C4CDE0B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "LambdaFunctionBF21E41F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" + }, + "Role": { + "Fn::GetAtt": [ + "TestTemplateWriterLambdaRole192FE23A", + "Arn" + ] + }, + "Handler": "index.handler", + "MemorySize": 1024, + "Runtime": "nodejs18.x", + "Timeout": 60, + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "TestTemplateWriterLambdaRoleDefaultPolicyBCFD88FC", + "TestTemplateWriterLambdaRole192FE23A" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A": { + "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" + ] + ] + } + ] + } + }, + "TestTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicy08B90D53": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "LambdaFunctionBF21E41F", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "LambdaFunctionBF21E41F", + "Arn" + ] + }, + ":*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "TestTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicy08B90D53", + "Roles": [ + { + "Ref": "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A" + } + ] + } + }, + "TestTemplateWriterProviderframeworkonEvent7FDD3553": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" + }, + "Role": { + "Fn::GetAtt": [ + "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A", + "Arn" + ] + }, + "Description": "AWS CDK resource provider framework - onEvent (template-writer-from-large-asset/TestTemplateWriterProvider)", + "Environment": { + "Variables": { + "USER_ON_EVENT_FUNCTION_ARN": { + "Fn::GetAtt": [ + "LambdaFunctionBF21E41F", + "Arn" + ] + } + } + }, + "Handler": "framework.onEvent", + "Runtime": "nodejs14.x", + "Timeout": 900 + }, + "DependsOn": [ + "TestTemplateWriterProviderframeworkonEventServiceRoleDefaultPolicy08B90D53", + "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework has an IAM role with the arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Managed Policy attached, which grants permission to write to CloudWatch Logs" + }, + { + "id": "W89", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not access VPC resources" + }, + { + "id": "W92", + "reason": "The CDK-provided lambda function that backs their Custom Resource Provider framework does not define ReservedConcurrentExecutions" + } + ] + } + } + }, + "TestTemplateWriterCustomResource": { + "Type": "Custom::TemplateWriter", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "TestTemplateWriterProviderframeworkonEvent7FDD3553", + "Arn" + ] + }, + "TemplateValues": "{\"templateValues\":[{\"id\":\"Lorem\",\"value\":\"LOREM_2\"},{\"id\":\"Velit\",\"value\":\"VELIT_2\"},{\"id\":\"Ornare\",\"value\":\"ORNARE_2\"},{\"id\":\"Ullamcorper\",\"value\":\"ULLAMCORPER_2\"},{\"id\":\"Blandit\",\"value\":\"BLANDIT_2\"},{\"id\":\"Bibendum\",\"value\":\"BIBENDUM_2\"}]}", + "TemplateInputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "TemplateInputKey": "122da676fba68619def0d539ff80855eaa0ba3686fb37faa298ce277c4feb8f8.122da676fba68619def0d539ff80855eaa0ba3686fb37faa298ce277c4feb8f8", + "TemplateOutputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.ts b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.ts new file mode 100644 index 000000000..ce0988c0a --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.ts @@ -0,0 +1,66 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { App, Duration, Stack } from "aws-cdk-lib"; +import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as path from 'path'; +import { TemplateValue, createTemplateWriterCustomResource } from "../lib/template-writer"; + +const app = new App(); +const stack = new Stack(app, generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for Template Writer Resource'; + +const templateAsset = new Asset(stack, 'TemplateAsset', { + path: path.join(__dirname, 'template/large-sample-template') +}); + +// this test will do a total of 5,760 substitutions across a 9.4MB text file +// Last integration test run used 286MB of memory with a function duration of 1.5 seconds + +const templateValues: TemplateValue[] = new Array( + { + id: 'Lorem', // 768 occurrences in large-sample-template + value: 'LOREM_2' + }, + { + id: 'Velit', // 640 occurrences in large-sample-template + value: 'VELIT_2' + }, + { + id: 'Ornare', // 1024 occurrences in large-sample-template + value: 'ORNARE_2' + }, + { + id: 'Ullamcorper', // 1152 occurrences in large-sample-template + value: 'ULLAMCORPER_2' + }, + { + id: 'Blandit', // 896 occurrences in large-sample-template + value: 'BLANDIT_2' + }, + { + id: 'Bibendum', // 1280 occurrences in large-sample-template + value: 'BIBENDUM_2' + } +); + +createTemplateWriterCustomResource(stack, 'Test', { + templateBucket: templateAsset.bucket, + templateKey: templateAsset.s3ObjectKey, + templateValues, + timeout: Duration.minutes(1), + memorySize: 1024 +}); + +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer.expected.json b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer.expected.json new file mode 100644 index 000000000..0a968389b --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer.expected.json @@ -0,0 +1,432 @@ +{ + "Description": "Integration Test for Tempalte Writer Resource", + "Resources": { + "TemplateWriterTemplateWriterLambdaRole8C61D206": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Role used by the TemplateWriterLambda to transform the incoming asset", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "CloudWatchLogs" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/97cd237b0ae069fe0711bcc6a711e213fdaf0956421de5b964de9ccd0d2b23a1.97cd237b0ae069fe0711bcc6a711e213fdaf0956421de5b964de9ccd0d2b23a1" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "ReadInputAssetPolicy" + }, + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:PutObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "WriteOutputAssetPolicy" + } + ] + } + }, + "TemplateWriterTemplateWriterLambdaRoleDefaultPolicy81F98029": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "TemplateWriterTemplateWriterLambdaRoleDefaultPolicy81F98029", + "Roles": [ + { + "Ref": "TemplateWriterTemplateWriterLambdaRole8C61D206" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "TemplateWriterTemplateWriterLambdaServiceRole24E2278A": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "TemplateWriterTemplateWriterLambda094E2FE3": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "547a4b3dc3398e50fa62f8292981f06976211ae2517fb8a4b0ad446205baf2e9.zip" + }, + "Role": { + "Fn::GetAtt": [ + "TemplateWriterTemplateWriterLambdaRole8C61D206", + "Arn" + ] + }, + "FunctionName": "TemplateWriterTemplateWriterLambda", + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "TemplateWriterTemplateWriterLambdaRoleDefaultPolicy81F98029", + "TemplateWriterTemplateWriterLambdaRole8C61D206" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "TemplateWriterProviderframeworkonEventServiceRole14EC32AA": { + "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" + ] + ] + } + ] + } + }, + "TemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyA2203573": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunction", + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "TemplateWriterTemplateWriterLambda094E2FE3", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "TemplateWriterTemplateWriterLambda094E2FE3", + "Arn" + ] + }, + ":*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "TemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyA2203573", + "Roles": [ + { + "Ref": "TemplateWriterProviderframeworkonEventServiceRole14EC32AA" + } + ] + } + }, + "TemplateWriterProviderframeworkonEventD5CA1A9E": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "e8fea7e029780f03a78580d41b7ffbc4551d6e7d6caa190a451880191c166189.zip" + }, + "Role": { + "Fn::GetAtt": [ + "TemplateWriterProviderframeworkonEventServiceRole14EC32AA", + "Arn" + ] + }, + "Description": "AWS CDK resource provider framework - onEvent (template-writer/TemplateWriterProvider)", + "Environment": { + "Variables": { + "USER_ON_EVENT_FUNCTION_ARN": { + "Fn::GetAtt": [ + "TemplateWriterTemplateWriterLambda094E2FE3", + "Arn" + ] + } + } + }, + "Handler": "framework.onEvent", + "Runtime": "nodejs14.x", + "Timeout": 900 + }, + "DependsOn": [ + "TemplateWriterProviderframeworkonEventServiceRoleDefaultPolicyA2203573", + "TemplateWriterProviderframeworkonEventServiceRole14EC32AA" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "TemplateWriterTemplateWriterCustomResource": { + "Type": "Custom::ApiTemplateWriter", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "TemplateWriterProviderframeworkonEventD5CA1A9E", + "Arn" + ] + }, + "TemplateValues": "{\"templateValues\":[{\"id\":\"placeholder\",\"value\":\"resolved_value\"}]}", + "TemplateInputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "TemplateInputKey": "97cd237b0ae069fe0711bcc6a711e213fdaf0956421de5b964de9ccd0d2b23a1.97cd237b0ae069fe0711bcc6a711e213fdaf0956421de5b964de9ccd0d2b23a1", + "TemplateOutputBucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/test/template-writer.test.ts b/source/patterns/@aws-solutions-constructs/resources/test/template-writer.test.ts new file mode 100644 index 000000000..3ec2af365 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/test/template-writer.test.ts @@ -0,0 +1,82 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { Duration, Stack } from 'aws-cdk-lib'; +import { Template } from 'aws-cdk-lib/assertions'; +import { TemplateValue, createTemplateWriterCustomResource } from '../lib/template-writer'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import * as path from 'path'; + +test('TemplateWriter sets properties correctly', () => { + const stack = new Stack(); + + const templateAsset = new Asset(stack, 'TemplateAsset', { + path: path.join(__dirname, 'template/sample-template') + }); + + const templateValues: TemplateValue[] = new Array( + { + id: 'placeholder', + value: 'resolved_value' + } + ); + + createTemplateWriterCustomResource(stack, 'Test', { + templateBucket: templateAsset.bucket, + templateKey: templateAsset.s3ObjectKey, + templateValues + }); + + const cfnTemplate = Template.fromStack(stack); + + cfnTemplate.hasResourceProperties('Custom::TemplateWriter', { + TemplateValues: JSON.stringify({ templateValues }), + TemplateInputKey: templateAsset.s3ObjectKey, + TemplateInputBucket: { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + TemplateOutputBucket: { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + }); +}); + +test('TemplateWriter accepts custom lambda function timeout and memory size', () => { + const stack = new Stack(); + + const templateAsset = new Asset(stack, 'TemplateAsset', { + path: path.join(__dirname, 'template/sample-template') + }); + + const templateValues: TemplateValue[] = new Array( + { + id: 'placeholder', + value: 'resolved_value' + } + ); + + createTemplateWriterCustomResource(stack, 'Test', { + templateBucket: templateAsset.bucket, + templateKey: templateAsset.s3ObjectKey, + templateValues, + timeout: Duration.minutes(7), + memorySize: 4096 + }); + + const cfnTemplate = Template.fromStack(stack); + + cfnTemplate.hasResourceProperties('AWS::Lambda::Function', { + Timeout: 420, + MemorySize: 4096 + }); +}); diff --git a/source/patterns/@aws-solutions-constructs/resources/test/template/large-sample-template b/source/patterns/@aws-solutions-constructs/resources/test/template/large-sample-template new file mode 100644 index 000000000..42d3cca25 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/test/template/large-sample-template @@ -0,0 +1,25599 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Placerat orci nulla pellentesque dignissim. Commodo viverra maecenas accumsan lacus vel. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Mauris a diam maecenas sed enim ut sem viverra aliquet. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut consequat. In nibh mauris cursus mattis molestie. Et sollicitudin ac orci phasellus. Odio morbi quis commodo odio aenean sed adipiscing diam. Amet venenatis urna cursus eget nunc scelerisque. Eget nullam non nisi est sit amet facilisis magna. Eget nunc scelerisque viverra mauris in. Vivamus arcu felis bibendum ut. Erat imperdiet sed euismod nisi porta. Ac tincidunt vitae semper quis lectus nulla at volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Eget duis at tellus at urna condimentum mattis pellentesque. Fermentum et sollicitudin ac orci. Habitant morbi tristique senectus et. + +Velit laoreet id donec ultrices tincidunt arcu non. Ac turpis egestas sed tempus urna. Libero volutpat sed cras ornare arcu dui vivamus arcu felis. Aliquam sem fringilla ut morbi. Viverra aliquet eget sit amet. Pretium lectus quam id leo in vitae turpis massa sed. Tempus quam pellentesque nec nam aliquam sem. Eget est lorem ipsum dolor sit amet consectetur adipiscing. Venenatis a condimentum vitae sapien pellentesque. Auctor augue mauris augue neque gravida in. Nullam vehicula ipsum a arcu cursus vitae. Purus ut faucibus pulvinar elementum integer enim. Elit at imperdiet dui accumsan sit. Risus sed vulputate odio ut enim blandit volutpat maecenas. + +Ornare quam viverra orci sagittis. Mattis pellentesque id nibh tortor id. Senectus et netus et malesuada fames ac turpis egestas sed. Nulla facilisi etiam dignissim diam. Sodales ut eu sem integer vitae justo eget magna. Purus viverra accumsan in nisl. Ultricies lacus sed turpis tincidunt. Bibendum at varius vel pharetra vel. Id ornare arcu odio ut sem nulla. Mi bibendum neque egestas congue. Non consectetur a erat nam. + +Ullamcorper a lacus vestibulum sed. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Id venenatis a condimentum vitae. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Ut enim blandit volutpat maecenas volutpat blandit. Est ultricies integer quis auctor elit. Sed nisi lacus sed viverra tellus in. In cursus turpis massa tincidunt dui ut ornare lectus sit. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. + +Blandit turpis cursus in hac. Etiam erat velit scelerisque in dictum. Viverra justo nec ultrices dui sapien eget mi proin. Diam volutpat commodo sed egestas egestas fringilla phasellus. Ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan. Nibh praesent tristique magna sit amet purus gravida. Cursus risus at ultrices mi tempus imperdiet nulla. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum est. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. Dolor sed viverra ipsum nunc aliquet bibendum. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Venenatis cras sed felis eget velit. Nascetur ridiculus mus mauris vitae. Amet facilisis magna etiam tempor orci. Justo laoreet sit amet cursus sit amet. + +Ut faucibus pulvinar elementum integer enim neque volutpat. Nec feugiat in fermentum posuere. Fusce id velit ut tortor pretium viverra suspendisse. Consequat mauris nunc congue nisi vitae suscipit tellus. Amet consectetur adipiscing elit pellentesque habitant morbi tristique. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Non odio euismod lacinia at quis risus. Pellentesque id nibh tortor id aliquet lectus proin nibh. Aliquam ultrices sagittis orci a scelerisque purus semper. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Imperdiet sed euismod nisi porta lorem. Turpis cursus in hac habitasse platea. Feugiat nibh sed pulvinar proin gravida. Semper quis lectus nulla at. Neque sodales ut etiam sit amet nisl purus in mollis. Bibendum arcu vitae elementum curabitur. Blandit libero volutpat sed cras ornare arcu dui vivamus. + +Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Sed arcu non odio euismod lacinia at quis risus. Elementum integer enim neque volutpat. Fermentum et sollicitudin ac orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Et malesuada fames ac turpis. Blandit aliquam etiam erat velit. Ac orci phasellus egestas tellus rutrum tellus pellentesque. Urna et pharetra pharetra massa massa ultricies mi quis. Tempor orci eu lobortis elementum nibh. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Morbi tristique senectus et netus et. Tempor nec feugiat nisl pretium fusce id velit ut. + +Vitae et leo duis ut diam quam. Nisi lacus sed viverra tellus in hac habitasse. Ullamcorper sit amet risus nullam eget felis eget. Id eu nisl nunc mi. Tempor commodo ullamcorper a lacus vestibulum sed arcu non. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Integer quis auctor elit sed. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Dolor sit amet consectetur adipiscing elit ut aliquam. Leo urna molestie at elementum eu facilisis. Sed risus ultricies tristique nulla aliquet enim. Mi eget mauris pharetra et ultrices neque. + +Eget mi proin sed libero enim sed faucibus turpis. Aliquam faucibus purus in massa tempor. Risus at ultrices mi tempus. Aliquet nec ullamcorper sit amet risus nullam eget felis. At consectetur lorem donec massa. Sed vulputate mi sit amet mauris commodo. Enim eu turpis egestas pretium aenean pharetra magna ac placerat. Turpis massa sed elementum tempus egestas sed sed risus. Feugiat vivamus at augue eget arcu dictum varius duis. Varius sit amet mattis vulputate enim nulla aliquet. Maecenas accumsan lacus vel facilisis volutpat est velit egestas. Mauris ultrices eros in cursus. Amet massa vitae tortor condimentum lacinia quis vel eros. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Non sodales neque sodales ut etiam sit amet. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. + +Porttitor lacus luctus accumsan tortor posuere ac. Risus viverra adipiscing at in tellus. Eu lobortis elementum nibh tellus molestie nunc non blandit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Egestas congue quisque egestas diam in arcu cursus euismod quis. Id velit ut tortor pretium viverra. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Dictumst vestibulum rhoncus est pellentesque elit. Sem fringilla ut morbi tincidunt augue interdum velit. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Fermentum posuere urna nec tincidunt. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Morbi tincidunt ornare massa eget egestas purus. Rhoncus urna neque viverra justo nec ultrices dui sapien eget. Iaculis at erat pellentesque adipiscing commodo. + +Nunc aliquet bibendum enim facilisis gravida neque convallis a cras. Scelerisque fermentum dui faucibus in ornare quam viverra. Nunc non blandit massa enim nec dui nunc mattis enim. Vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Bibendum enim facilisis gravida neque convallis a cras. Non arcu risus quis varius. Pellentesque adipiscing commodo elit at imperdiet. Magna ac placerat vestibulum lectus mauris. Tortor aliquam nulla facilisi cras fermentum odio. Faucibus in ornare quam viverra orci sagittis eu volutpat. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Nisl tincidunt eget nullam non nisi est sit amet facilisis. Congue eu consequat ac felis. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu lobortis elementum nibh tellus. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et netus. Eget egestas purus viverra accumsan in. + +Massa sed elementum tempus egestas sed sed risus pretium quam. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Nullam ac tortor vitae purus faucibus ornare. Faucibus vitae aliquet nec ullamcorper sit amet risus. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Pharetra et ultrices neque ornare aenean euismod elementum. Sollicitudin aliquam ultrices sagittis orci a. Malesuada pellentesque elit eget gravida cum. Placerat orci nulla pellentesque dignissim enim. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Vitae auctor eu augue ut lectus arcu. Augue lacus viverra vitae congue eu. Libero volutpat sed cras ornare arcu dui vivamus arcu. Porta lorem mollis aliquam ut porttitor leo a diam. Tellus in metus vulputate eu scelerisque felis. Non consectetur a erat nam at lectus. Sed lectus vestibulum mattis ullamcorper velit. Nisl vel pretium lectus quam id leo in vitae. Quis vel eros donec ac odio tempor orci. + +Congue eu consequat ac felis donec et odio pellentesque. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Egestas dui id ornare arcu odio. Arcu ac tortor dignissim convallis aenean et tortor at. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Amet nisl purus in mollis nunc. At consectetur lorem donec massa sapien. Feugiat vivamus at augue eget. Elementum nisi quis eleifend quam. Vulputate enim nulla aliquet porttitor lacus luctus. Cras semper auctor neque vitae. Vitae suscipit tellus mauris a diam maecenas. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper. Arcu non sodales neque sodales ut. Ultrices dui sapien eget mi proin sed libero enim sed. Aenean et tortor at risus viverra adipiscing at. Viverra nibh cras pulvinar mattis nunc sed. Aliquam id diam maecenas ultricies mi eget. + +Ut diam quam nulla porttitor massa id neque aliquam. Non tellus orci ac auctor augue mauris augue neque. Pretium aenean pharetra magna ac. Eu nisl nunc mi ipsum faucibus vitae. Enim facilisis gravida neque convallis a cras semper auctor. Phasellus faucibus scelerisque eleifend donec pretium vulputate. Laoreet sit amet cursus sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est sit amet facilisis magna etiam tempor orci eu lobortis. Justo donec enim diam vulputate ut pharetra. Varius morbi enim nunc faucibus a pellentesque. Pretium fusce id velit ut tortor pretium viverra suspendisse potenti. Aliquam sem fringilla ut morbi. + +Mauris rhoncus aenean vel elit scelerisque. Amet nisl suscipit adipiscing bibendum. Faucibus vitae aliquet nec ullamcorper sit amet risus. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Auctor eu augue ut lectus arcu bibendum at varius. Maecenas accumsan lacus vel facilisis volutpat. Leo vel fringilla est ullamcorper. Sagittis eu volutpat odio facilisis mauris. Risus feugiat in ante metus dictum. Suspendisse sed nisi lacus sed viverra tellus in. Nisl condimentum id venenatis a condimentum vitae sapien. + +Congue quisque egestas diam in arcu cursus euismod quis viverra. Diam quam nulla porttitor massa id neque aliquam. Maecenas pharetra convallis posuere morbi leo urna molestie. Faucibus scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Viverra aliquet eget sit amet tellus cras adipiscing. Auctor urna nunc id cursus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Dapibus ultrices in iaculis nunc. Lacinia at quis risus sed vulputate odio ut enim. Amet venenatis urna cursus eget nunc scelerisque viverra. + +Accumsan sit amet nulla facilisi. Feugiat nibh sed pulvinar proin. Ut faucibus pulvinar elementum integer enim neque. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Amet aliquam id diam maecenas ultricies. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Lacus suspendisse faucibus interdum posuere lorem ipsum. Sed tempus urna et pharetra pharetra. Nec ultrices dui sapien eget. In arcu cursus euismod quis viverra nibh cras pulvinar. Tristique senectus et netus et malesuada. Ultrices eros in cursus turpis massa tincidunt dui. Pellentesque pulvinar pellentesque habitant morbi. Vestibulum sed arcu non odio euismod lacinia at quis. A scelerisque purus semper eget duis at tellus at. Sed faucibus turpis in eu mi bibendum neque egestas congue. Commodo sed egestas egestas fringilla. Dui vivamus arcu felis bibendum ut tristique et egestas. + +Mi proin sed libero enim sed. Posuere morbi leo urna molestie at elementum eu. Justo donec enim diam vulputate ut pharetra. Aliquet porttitor lacus luctus accumsan tortor. Elementum nisi quis eleifend quam adipiscing. Nec ultrices dui sapien eget mi proin. Commodo sed egestas egestas fringilla phasellus. Amet facilisis magna etiam tempor orci eu. Magna fermentum iaculis eu non diam. Purus faucibus ornare suspendisse sed nisi lacus sed viverra. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Odio aenean sed adipiscing diam donec adipiscing tristique. Elementum facilisis leo vel fringilla. Faucibus vitae aliquet nec ullamcorper sit amet. + +Consequat id porta nibh venenatis cras sed felis eget. Ac felis donec et odio pellentesque diam volutpat. Facilisis volutpat est velit egestas dui id ornare. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Arcu bibendum at varius vel pharetra vel turpis. Dictum sit amet justo donec. Donec massa sapien faucibus et molestie ac feugiat sed lectus. Ac turpis egestas sed tempus urna et pharetra pharetra. Aliquet nec ullamcorper sit amet risus nullam eget. Diam phasellus vestibulum lorem sed risus ultricies tristique. Ultrices in iaculis nunc sed augue lacus viverra. Eget egestas purus viverra accumsan in nisl nisi. Felis donec et odio pellentesque. Ullamcorper eget nulla facilisi etiam dignissim diam. Aliquet nec ullamcorper sit amet risus nullam eget felis eget. Est sit amet facilisis magna etiam tempor orci eu lobortis. Pellentesque sit amet porttitor eget dolor. Consectetur adipiscing elit duis tristique sollicitudin. + +Eu mi bibendum neque egestas congue. Pellentesque habitant morbi tristique senectus et netus. Magna etiam tempor orci eu lobortis. Porttitor eget dolor morbi non arcu risus quis varius. Velit dignissim sodales ut eu. Enim nulla aliquet porttitor lacus luctus accumsan tortor. Sit amet tellus cras adipiscing enim. Nulla malesuada pellentesque elit eget. Lectus urna duis convallis convallis tellus id. Vitae nunc sed velit dignissim sodales ut eu sem integer. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Integer feugiat scelerisque varius morbi enim nunc faucibus. Scelerisque eu ultrices vitae auctor eu augue. Consectetur purus ut faucibus pulvinar. Sagittis id consectetur purus ut. Mattis ullamcorper velit sed ullamcorper. + +Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Aliquet enim tortor at auctor urna nunc. Turpis egestas sed tempus urna et pharetra. Consequat interdum varius sit amet mattis. Scelerisque varius morbi enim nunc faucibus. Eget felis eget nunc lobortis mattis aliquam faucibus purus. Consequat interdum varius sit amet mattis. Lacinia quis vel eros donec ac. Ullamcorper a lacus vestibulum sed arcu non odio euismod lacinia. Aliquet nibh praesent tristique magna sit. Morbi tincidunt ornare massa eget egestas purus. Vel fringilla est ullamcorper eget nulla facilisi. + +Aliquam nulla facilisi cras fermentum odio eu. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum integer. Fermentum dui faucibus in ornare. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Turpis nunc eget lorem dolor sed viverra ipsum. Adipiscing elit ut aliquam purus. Enim nunc faucibus a pellentesque sit amet. Arcu odio ut sem nulla. Orci ac auctor augue mauris augue neque gravida in. Bibendum neque egestas congue quisque egestas diam. + +Leo vel fringilla est ullamcorper. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Varius vel pharetra vel turpis nunc eget lorem dolor. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Ut faucibus pulvinar elementum integer. Tellus at urna condimentum mattis pellentesque id nibh tortor id. Dui vivamus arcu felis bibendum ut tristique. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Mauris pharetra et ultrices neque ornare aenean euismod. Morbi tincidunt augue interdum velit euismod in. + +Dui faucibus in ornare quam viverra orci sagittis eu. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet risus. Ante in nibh mauris cursus. Arcu dui vivamus arcu felis bibendum ut tristique et. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Etiam dignissim diam quis enim lobortis. Tincidunt id aliquet risus feugiat in ante. Aliquam etiam erat velit scelerisque. Iaculis nunc sed augue lacus viverra. Blandit libero volutpat sed cras ornare arcu dui. Diam in arcu cursus euismod quis viverra nibh cras pulvinar. Vivamus at augue eget arcu dictum varius duis at. Odio tempor orci dapibus ultrices in iaculis nunc sed. Semper quis lectus nulla at volutpat diam ut venenatis. Id diam vel quam elementum pulvinar etiam non quam lacus. Eget arcu dictum varius duis at consectetur. Posuere lorem ipsum dolor sit amet consectetur adipiscing. Ultrices dui sapien eget mi proin. Sed enim ut sem viverra aliquet eget sit. Nisl suscipit adipiscing bibendum est ultricies. + +Nisl pretium fusce id velit ut tortor. Porttitor eget dolor morbi non arcu risus quis varius. Mauris augue neque gravida in fermentum et sollicitudin ac. Etiam erat velit scelerisque in dictum non consectetur a. Ornare quam viverra orci sagittis eu volutpat. Massa ultricies mi quis hendrerit dolor. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Arcu felis bibendum ut tristique et egestas. Amet purus gravida quis blandit. Eu consequat ac felis donec et. Sagittis orci a scelerisque purus semper. + +Vulputate dignissim suspendisse in est ante in nibh. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Odio tempor orci dapibus ultrices in. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Est ullamcorper eget nulla facilisi etiam dignissim. Semper feugiat nibh sed pulvinar. Cras sed felis eget velit aliquet. Porttitor eget dolor morbi non arcu risus. Facilisis sed odio morbi quis commodo. Tempus imperdiet nulla malesuada pellentesque elit eget. Fermentum leo vel orci porta non pulvinar neque. Habitasse platea dictumst quisque sagittis purus. Cursus turpis massa tincidunt dui ut ornare lectus sit amet. Id aliquet lectus proin nibh nisl. Vestibulum sed arcu non odio euismod lacinia at. + +Tellus cras adipiscing enim eu turpis egestas pretium aenean. Ipsum dolor sit amet consectetur adipiscing elit ut. Mattis rhoncus urna neque viverra justo nec ultrices. Viverra nibh cras pulvinar mattis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus. Duis ultricies lacus sed turpis tincidunt id. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut placerat orci nulla pellentesque. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Dolor purus non enim praesent elementum facilisis leo vel fringilla. + +Amet mauris commodo quis imperdiet massa tincidunt nunc. Gravida arcu ac tortor dignissim convallis. Consequat nisl vel pretium lectus quam id leo. Lacus luctus accumsan tortor posuere ac ut consequat semper. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna duis convallis convallis tellus id interdum velit laoreet id. Sagittis orci a scelerisque purus. Ipsum dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Est pellentesque elit ullamcorper dignissim cras. Ipsum consequat nisl vel pretium lectus quam id leo in. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Elit sed vulputate mi sit. Tincidunt dui ut ornare lectus sit amet. Velit laoreet id donec ultrices tincidunt arcu. Aliquam eleifend mi in nulla. Lacinia quis vel eros donec ac. Potenti nullam ac tortor vitae purus faucibus ornare suspendisse. Tortor consequat id porta nibh venenatis cras sed. Elementum pulvinar etiam non quam lacus. Suspendisse interdum consectetur libero id faucibus nisl tincidunt. Tincidunt eget nullam non nisi. Tortor posuere ac ut consequat semper. Dignissim sodales ut eu sem integer vitae. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. + +Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Arcu cursus euismod quis viverra nibh cras pulvinar. Molestie a iaculis at erat. Augue neque gravida in fermentum et sollicitudin ac. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed vulputate mi sit amet. Euismod in pellentesque massa placerat duis ultricies lacus. Amet est placerat in egestas. Vitae proin sagittis nisl rhoncus mattis rhoncus urna. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Rhoncus mattis rhoncus urna neque viverra. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Sed vulputate odio ut enim. Ut placerat orci nulla pellentesque. Non tellus orci ac auctor augue. Mauris a diam maecenas sed. Mattis molestie a iaculis at. Lorem donec massa sapien faucibus et molestie ac. Elementum tempus egestas sed sed risus pretium. Nec sagittis aliquam malesuada bibendum arcu vitae. + +Diam in arcu cursus euismod quis. In nulla posuere sollicitudin aliquam ultrices sagittis. Convallis convallis tellus id interdum velit laoreet. Mattis pellentesque id nibh tortor id aliquet lectus. A condimentum vitae sapien pellentesque habitant morbi tristique senectus. Nisi porta lorem mollis aliquam. Aliquam ultrices sagittis orci a scelerisque purus semper eget. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Tellus in metus vulputate eu scelerisque felis imperdiet. Sit amet nisl suscipit adipiscing bibendum. + +Tincidunt augue interdum velit euismod in pellentesque massa. Quis varius quam quisque id. Leo vel fringilla est ullamcorper. Dui sapien eget mi proin sed. Sed adipiscing diam donec adipiscing tristique risus nec. Cursus metus aliquam eleifend mi in nulla. Risus ultricies tristique nulla aliquet enim tortor at auctor. Donec ultrices tincidunt arcu non sodales neque sodales ut. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Vulputate eu scelerisque felis imperdiet. Maecenas pharetra convallis posuere morbi leo. Faucibus ornare suspendisse sed nisi lacus sed viverra. + +Tortor posuere ac ut consequat semper viverra nam libero. Accumsan in nisl nisi scelerisque eu ultrices. Cursus metus aliquam eleifend mi in nulla posuere. Vitae justo eget magna fermentum iaculis eu. Dignissim sodales ut eu sem integer vitae. Libero enim sed faucibus turpis in eu. Pharetra et ultrices neque ornare aenean euismod. Pretium fusce id velit ut. Tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Orci phasellus egestas tellus rutrum tellus. Tristique senectus et netus et malesuada fames ac turpis. + +Pharetra vel turpis nunc eget lorem dolor sed. Erat velit scelerisque in dictum non consectetur a. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Est velit egestas dui id ornare arcu odio ut. Eu consequat ac felis donec et. Orci a scelerisque purus semper eget duis. Suscipit adipiscing bibendum est ultricies integer. Pellentesque habitant morbi tristique senectus et netus et. Lacus viverra vitae congue eu consequat ac. Adipiscing elit pellentesque habitant morbi. Commodo elit at imperdiet dui accumsan sit amet nulla facilisi. Viverra suspendisse potenti nullam ac tortor vitae. Turpis egestas integer eget aliquet. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit. + +Ut tellus elementum sagittis vitae et leo duis ut. Habitant morbi tristique senectus et netus et malesuada. Volutpat sed cras ornare arcu dui vivamus. Fermentum leo vel orci porta non. Est ante in nibh mauris cursus mattis molestie. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Est placerat in egestas erat imperdiet. Cursus eget nunc scelerisque viverra mauris in. Pellentesque dignissim enim sit amet. Aliquam faucibus purus in massa tempor nec feugiat nisl. Lacus luctus accumsan tortor posuere ac ut consequat semper. Scelerisque felis imperdiet proin fermentum leo vel orci. Tristique nulla aliquet enim tortor at auctor urna. Pretium lectus quam id leo in. + +Ultrices sagittis orci a scelerisque. Commodo quis imperdiet massa tincidunt. Cursus turpis massa tincidunt dui ut ornare. Sem nulla pharetra diam sit. Morbi non arcu risus quis varius quam quisque. Imperdiet nulla malesuada pellentesque elit eget gravida. Bibendum neque egestas congue quisque egestas. Morbi tempus iaculis urna id volutpat lacus laoreet. Id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing. Et leo duis ut diam quam nulla porttitor. Dui id ornare arcu odio ut sem. Sollicitudin ac orci phasellus egestas tellus rutrum tellus. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Volutpat sed cras ornare arcu dui vivamus arcu felis bibendum. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Ac feugiat sed lectus vestibulum mattis ullamcorper. + +Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ac tortor dignissim convallis aenean et tortor at. Nam aliquam sem et tortor consequat id porta nibh venenatis. Magna fermentum iaculis eu non diam. Enim neque volutpat ac tincidunt vitae semper quis. Nec ullamcorper sit amet risus nullam eget. Condimentum id venenatis a condimentum vitae sapien pellentesque. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Tristique nulla aliquet enim tortor at auctor. Odio ut sem nulla pharetra diam sit amet. Iaculis eu non diam phasellus. Malesuada proin libero nunc consequat interdum varius. Dui nunc mattis enim ut. Curabitur vitae nunc sed velit dignissim sodales ut. Odio aenean sed adipiscing diam donec adipiscing. At tellus at urna condimentum mattis pellentesque id nibh. Odio eu feugiat pretium nibh ipsum. + +Nullam ac tortor vitae purus faucibus ornare. Urna neque viverra justo nec ultrices. Turpis egestas pretium aenean pharetra magna. Ut pharetra sit amet aliquam id diam maecenas ultricies. Sed faucibus turpis in eu mi bibendum. Cras semper auctor neque vitae tempus quam. Est ullamcorper eget nulla facilisi. Mi proin sed libero enim sed faucibus turpis in eu. Arcu bibendum at varius vel pharetra vel. Amet facilisis magna etiam tempor orci eu lobortis elementum. Eu mi bibendum neque egestas congue. Elementum eu facilisis sed odio morbi quis commodo odio. Ut etiam sit amet nisl purus in mollis nunc sed. Lobortis mattis aliquam faucibus purus in massa tempor. In fermentum et sollicitudin ac orci phasellus. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Augue eget arcu dictum varius duis at consectetur lorem donec. Quis blandit turpis cursus in. + +A scelerisque purus semper eget duis at tellus at. Dignissim diam quis enim lobortis scelerisque fermentum. Ac odio tempor orci dapibus ultrices in iaculis nunc. A erat nam at lectus urna duis convallis. Faucibus scelerisque eleifend donec pretium vulputate. Eget velit aliquet sagittis id consectetur. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Massa id neque aliquam vestibulum morbi blandit. Ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget. Proin sagittis nisl rhoncus mattis rhoncus urna. Nunc sed blandit libero volutpat sed cras. Semper risus in hendrerit gravida rutrum quisque non tellus orci. + +Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Neque viverra justo nec ultrices dui sapien. Sollicitudin ac orci phasellus egestas tellus. Quis varius quam quisque id diam vel quam elementum. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Malesuada proin libero nunc consequat interdum. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Fringilla phasellus faucibus scelerisque eleifend donec. Diam in arcu cursus euismod. Eu facilisis sed odio morbi. Amet venenatis urna cursus eget nunc. Urna nunc id cursus metus aliquam eleifend mi in nulla. Nullam ac tortor vitae purus. Mi bibendum neque egestas congue quisque. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Sapien pellentesque habitant morbi tristique senectus et netus et. Eleifend mi in nulla posuere. + +Enim tortor at auctor urna nunc id cursus metus. Dui accumsan sit amet nulla facilisi morbi tempus. Malesuada nunc vel risus commodo viverra maecenas. Suscipit tellus mauris a diam maecenas sed enim. Commodo elit at imperdiet dui accumsan sit. Imperdiet nulla malesuada pellentesque elit eget. Tellus elementum sagittis vitae et. Sem viverra aliquet eget sit amet. Faucibus interdum posuere lorem ipsum dolor sit amet consectetur. Dui ut ornare lectus sit amet est placerat in egestas. Sagittis purus sit amet volutpat consequat. + +Tortor id aliquet lectus proin nibh nisl condimentum id. Blandit aliquam etiam erat velit scelerisque in dictum non. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque. Faucibus nisl tincidunt eget nullam non. Augue eget arcu dictum varius duis at consectetur lorem. Magnis dis parturient montes nascetur. Convallis posuere morbi leo urna molestie at elementum eu. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Enim ut tellus elementum sagittis. Sagittis orci a scelerisque purus semper eget. Tortor at risus viverra adipiscing. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. In hac habitasse platea dictumst quisque sagittis purus sit amet. Amet volutpat consequat mauris nunc congue nisi vitae suscipit. Mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. Nullam vehicula ipsum a arcu cursus vitae. + +Elementum tempus egestas sed sed risus pretium quam. Ac felis donec et odio pellentesque diam. Id velit ut tortor pretium viverra suspendisse potenti. Sollicitudin aliquam ultrices sagittis orci. Quis enim lobortis scelerisque fermentum dui. Consequat id porta nibh venenatis cras sed. Ut etiam sit amet nisl purus in mollis. Iaculis urna id volutpat lacus. Dolor sed viverra ipsum nunc aliquet bibendum enim. Orci sagittis eu volutpat odio facilisis mauris sit amet. Consequat mauris nunc congue nisi vitae. Ante in nibh mauris cursus mattis molestie a. Senectus et netus et malesuada fames. Sagittis purus sit amet volutpat. + +Aliquet nibh praesent tristique magna sit amet purus gravida. Viverra ipsum nunc aliquet bibendum enim facilisis gravida. Tincidunt praesent semper feugiat nibh sed pulvinar proin. Eu nisl nunc mi ipsum. Tortor at auctor urna nunc id cursus. Ullamcorper morbi tincidunt ornare massa. Sit amet cursus sit amet dictum sit. Sit amet nisl purus in mollis nunc sed id. Morbi leo urna molestie at. Maecenas volutpat blandit aliquam etiam erat velit scelerisque in. At in tellus integer feugiat scelerisque. Amet mauris commodo quis imperdiet massa. Et netus et malesuada fames ac turpis. In nulla posuere sollicitudin aliquam ultrices sagittis orci a. Curabitur vitae nunc sed velit dignissim sodales ut eu. + +Eget mauris pharetra et ultrices neque ornare aenean euismod. Feugiat scelerisque varius morbi enim. Sem viverra aliquet eget sit. Orci porta non pulvinar neque laoreet suspendisse interdum. Eget nulla facilisi etiam dignissim diam quis enim lobortis. Pellentesque id nibh tortor id aliquet lectus. Proin fermentum leo vel orci. Fermentum dui faucibus in ornare quam. Eu scelerisque felis imperdiet proin fermentum leo. Ut tortor pretium viverra suspendisse potenti nullam. Hendrerit dolor magna eget est lorem ipsum dolor. Adipiscing bibendum est ultricies integer quis. Porta nibh venenatis cras sed felis eget velit aliquet. Leo in vitae turpis massa sed elementum tempus. Cursus metus aliquam eleifend mi in nulla posuere. Eu mi bibendum neque egestas congue quisque egestas. Blandit cursus risus at ultrices mi. + +Imperdiet nulla malesuada pellentesque elit eget gravida. Ut sem viverra aliquet eget sit amet tellus cras. At consectetur lorem donec massa sapien faucibus. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Tortor posuere ac ut consequat semper. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Sed ullamcorper morbi tincidunt ornare massa eget egestas. Est pellentesque elit ullamcorper dignissim. Aliquet bibendum enim facilisis gravida neque convallis. Fringilla est ullamcorper eget nulla facilisi etiam dignissim diam. Ut tellus elementum sagittis vitae et leo duis ut diam. Amet purus gravida quis blandit. Euismod in pellentesque massa placerat duis ultricies lacus. Metus vulputate eu scelerisque felis. Cursus in hac habitasse platea dictumst. Euismod quis viverra nibh cras pulvinar mattis nunc. Tempus quam pellentesque nec nam aliquam. + +Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Sed lectus vestibulum mattis ullamcorper velit sed. Nec feugiat nisl pretium fusce id velit ut. Libero id faucibus nisl tincidunt eget nullam. Felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Amet luctus venenatis lectus magna fringilla urna. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget gravida. Mauris nunc congue nisi vitae suscipit. Scelerisque viverra mauris in aliquam sem fringilla ut. Tincidunt ornare massa eget egestas. Nunc lobortis mattis aliquam faucibus purus in massa tempor nec. Lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci. Sagittis orci a scelerisque purus semper eget duis at tellus. + +Morbi tristique senectus et netus et malesuada. Ante in nibh mauris cursus mattis molestie a. Vitae suscipit tellus mauris a. Vitae semper quis lectus nulla at volutpat. Quam id leo in vitae turpis. Et leo duis ut diam quam nulla porttitor massa id. Sed augue lacus viverra vitae. A lacus vestibulum sed arcu. Proin sed libero enim sed. Sed vulputate mi sit amet mauris commodo quis. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Cum sociis natoque penatibus et magnis dis parturient montes nascetur. Amet commodo nulla facilisi nullam. Urna neque viverra justo nec ultrices dui sapien eget mi. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. + +At elementum eu facilisis sed odio morbi. Eu volutpat odio facilisis mauris sit. Dictum sit amet justo donec enim. Vestibulum lorem sed risus ultricies tristique nulla aliquet enim. Ante in nibh mauris cursus. Id cursus metus aliquam eleifend mi in nulla. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Varius duis at consectetur lorem donec massa sapien faucibus. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Commodo odio aenean sed adipiscing diam. Id porta nibh venenatis cras. Elementum sagittis vitae et leo duis ut diam. Id venenatis a condimentum vitae sapien. Erat imperdiet sed euismod nisi porta lorem mollis. + +Ut enim blandit volutpat maecenas volutpat blandit aliquam. Ullamcorper malesuada proin libero nunc consequat interdum. Sit amet massa vitae tortor condimentum lacinia quis vel. In massa tempor nec feugiat nisl pretium fusce. Elementum tempus egestas sed sed. Eget arcu dictum varius duis at. Sit amet volutpat consequat mauris nunc congue nisi vitae suscipit. Etiam sit amet nisl purus in mollis nunc sed id. Interdum posuere lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum posuere urna nec tincidunt praesent. + +Fringilla urna porttitor rhoncus dolor purus non enim praesent. At urna condimentum mattis pellentesque id nibh. In tellus integer feugiat scelerisque varius morbi. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Ut ornare lectus sit amet. Urna porttitor rhoncus dolor purus non enim. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Placerat in egestas erat imperdiet sed euismod nisi porta. In hendrerit gravida rutrum quisque non tellus orci ac auctor. Feugiat in ante metus dictum at. Faucibus ornare suspendisse sed nisi lacus sed viverra tellus in. Felis eget nunc lobortis mattis aliquam. Mattis enim ut tellus elementum sagittis vitae et. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Purus faucibus ornare suspendisse sed. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. + +Ornare quam viverra orci sagittis eu volutpat odio facilisis mauris. Nunc aliquet bibendum enim facilisis gravida neque. Adipiscing tristique risus nec feugiat in fermentum posuere. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Arcu dui vivamus arcu felis bibendum. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Nam aliquam sem et tortor consequat id porta nibh venenatis. Aliquam sem fringilla ut morbi tincidunt augue interdum velit euismod. Ac ut consequat semper viverra nam libero justo laoreet. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Consequat mauris nunc congue nisi vitae suscipit tellus mauris. + +Convallis tellus id interdum velit. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Enim praesent elementum facilisis leo vel fringilla. Eu consequat ac felis donec et. In metus vulputate eu scelerisque felis. Turpis nunc eget lorem dolor sed. Nisi scelerisque eu ultrices vitae auctor eu augue ut lectus. Malesuada pellentesque elit eget gravida cum sociis natoque. Congue nisi vitae suscipit tellus mauris a diam maecenas. Consectetur libero id faucibus nisl tincidunt eget nullam. Lorem sed risus ultricies tristique. Amet mauris commodo quis imperdiet massa tincidunt. Sit amet risus nullam eget felis eget nunc lobortis. Ut sem nulla pharetra diam. + +Aenean pharetra magna ac placerat vestibulum. Lacus luctus accumsan tortor posuere. Pharetra et ultrices neque ornare aenean euismod elementum nisi quis. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Quam adipiscing vitae proin sagittis. Nisi lacus sed viverra tellus in hac habitasse platea. In nulla posuere sollicitudin aliquam. Ut aliquam purus sit amet luctus. Neque viverra justo nec ultrices dui sapien eget. Interdum velit laoreet id donec ultrices tincidunt arcu non. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Gravida neque convallis a cras semper auctor. Amet nisl purus in mollis nunc sed. Sit amet aliquam id diam maecenas. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Leo vel orci porta non pulvinar neque laoreet. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Ultrices sagittis orci a scelerisque. + +Sagittis eu volutpat odio facilisis. Enim ut sem viverra aliquet eget sit amet. Ac turpis egestas sed tempus urna et pharetra pharetra massa. Odio morbi quis commodo odio aenean sed. Venenatis cras sed felis eget velit. A scelerisque purus semper eget duis at tellus at urna. Urna condimentum mattis pellentesque id nibh. Ut pharetra sit amet aliquam. Purus semper eget duis at tellus. Ultricies lacus sed turpis tincidunt id aliquet. Mauris ultrices eros in cursus turpis massa. Faucibus interdum posuere lorem ipsum dolor. Non blandit massa enim nec dui nunc mattis enim. Aenean euismod elementum nisi quis eleifend quam adipiscing. Lectus quam id leo in vitae turpis. Dolor purus non enim praesent. + +Euismod lacinia at quis risus sed vulputate odio. Pellentesque adipiscing commodo elit at imperdiet dui accumsan. Amet purus gravida quis blandit turpis cursus in hac. Nibh venenatis cras sed felis eget velit aliquet sagittis id. Non sodales neque sodales ut etiam sit amet nisl. Pulvinar sapien et ligula ullamcorper malesuada proin. Orci phasellus egestas tellus rutrum tellus pellentesque. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Curabitur vitae nunc sed velit dignissim. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. + +Feugiat vivamus at augue eget arcu dictum varius. Condimentum lacinia quis vel eros donec ac odio tempor orci. Porttitor eget dolor morbi non arcu risus quis varius quam. Tellus molestie nunc non blandit. Tortor dignissim convallis aenean et tortor at. Ut faucibus pulvinar elementum integer enim neque volutpat. Consectetur libero id faucibus nisl tincidunt eget nullam non. Integer eget aliquet nibh praesent tristique magna sit amet purus. Tincidunt ornare massa eget egestas. Nunc non blandit massa enim nec dui nunc. Facilisis volutpat est velit egestas dui id. Pretium lectus quam id leo in vitae turpis massa. + +Posuere ac ut consequat semper viverra nam libero justo. Ac ut consequat semper viverra. In mollis nunc sed id semper risus in hendrerit. Fusce id velit ut tortor pretium viverra suspendisse potenti. Ut tristique et egestas quis. Purus semper eget duis at tellus at urna. Dui ut ornare lectus sit amet est. Cursus euismod quis viverra nibh cras pulvinar. Magna fringilla urna porttitor rhoncus. Id aliquet risus feugiat in ante metus dictum at. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. + +Ornare arcu odio ut sem nulla. Hendrerit dolor magna eget est lorem ipsum dolor sit. Egestas diam in arcu cursus euismod quis viverra. Nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi. Nec dui nunc mattis enim. Auctor urna nunc id cursus metus aliquam eleifend mi in. Massa vitae tortor condimentum lacinia quis. Ac odio tempor orci dapibus ultrices. Interdum varius sit amet mattis. Sed egestas egestas fringilla phasellus. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Consequat mauris nunc congue nisi vitae. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. + +Duis tristique sollicitudin nibh sit. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Diam maecenas ultricies mi eget mauris pharetra et ultrices neque. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Amet est placerat in egestas erat imperdiet sed euismod. Nibh sed pulvinar proin gravida hendrerit lectus. At volutpat diam ut venenatis. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Est placerat in egestas erat imperdiet sed euismod. + +Imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis. Amet dictum sit amet justo donec enim diam. Scelerisque eu ultrices vitae auctor eu. Nulla posuere sollicitudin aliquam ultrices. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Libero enim sed faucibus turpis in. Pretium viverra suspendisse potenti nullam ac tortor vitae purus. Scelerisque viverra mauris in aliquam sem fringilla. Phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. A diam sollicitudin tempor id eu nisl nunc. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Cursus metus aliquam eleifend mi in nulla. Ut morbi tincidunt augue interdum velit euismod in pellentesque massa. Aliquam vestibulum morbi blandit cursus risus at ultrices. Sit amet volutpat consequat mauris nunc congue nisi. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Mauris pharetra et ultrices neque ornare aenean. Nisl vel pretium lectus quam. + +Tellus molestie nunc non blandit massa. Nascetur ridiculus mus mauris vitae. Sed cras ornare arcu dui. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Dui nunc mattis enim ut tellus elementum sagittis. Sagittis eu volutpat odio facilisis mauris sit amet massa. Elit at imperdiet dui accumsan sit. At tellus at urna condimentum mattis. Semper risus in hendrerit gravida rutrum quisque non tellus. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Dui id ornare arcu odio ut sem nulla pharetra diam. + +Morbi non arcu risus quis varius quam quisque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Maecenas ultricies mi eget mauris pharetra et. Cursus turpis massa tincidunt dui ut. Est sit amet facilisis magna etiam tempor orci. Fames ac turpis egestas maecenas pharetra convallis posuere morbi leo. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Mi ipsum faucibus vitae aliquet. Tincidunt ornare massa eget egestas purus. Semper auctor neque vitae tempus quam pellentesque nec. Nibh sed pulvinar proin gravida. Massa vitae tortor condimentum lacinia quis vel eros donec ac. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Arcu cursus euismod quis viverra nibh cras pulvinar. Et egestas quis ipsum suspendisse ultrices gravida. + +Varius morbi enim nunc faucibus a pellentesque. Quisque sagittis purus sit amet volutpat consequat mauris nunc. Dictumst quisque sagittis purus sit amet volutpat consequat mauris nunc. Nulla pellentesque dignissim enim sit. Sit amet tellus cras adipiscing enim eu. Felis donec et odio pellentesque. Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Urna cursus eget nunc scelerisque viverra mauris in. Bibendum at varius vel pharetra. Fames ac turpis egestas integer eget aliquet nibh praesent. Risus nec feugiat in fermentum posuere urna nec tincidunt. Pulvinar elementum integer enim neque volutpat ac tincidunt. Vulputate ut pharetra sit amet aliquam id diam maecenas ultricies. + +Lectus urna duis convallis convallis. Lectus vestibulum mattis ullamcorper velit. Elit ullamcorper dignissim cras tincidunt lobortis feugiat. Urna neque viverra justo nec ultrices. Nunc congue nisi vitae suscipit. Purus in massa tempor nec feugiat nisl pretium fusce. Enim neque volutpat ac tincidunt. Libero nunc consequat interdum varius. A condimentum vitae sapien pellentesque habitant morbi tristique. Cras semper auctor neque vitae tempus quam pellentesque nec nam. Pharetra et ultrices neque ornare. + +Eu mi bibendum neque egestas congue quisque egestas diam in. Faucibus purus in massa tempor nec feugiat nisl. Et odio pellentesque diam volutpat commodo sed egestas egestas. Suscipit adipiscing bibendum est ultricies integer quis auctor. Ipsum a arcu cursus vitae. Enim praesent elementum facilisis leo vel fringilla est. Sed vulputate odio ut enim. Et pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Semper auctor neque vitae tempus quam pellentesque nec nam. Nibh ipsum consequat nisl vel pretium. Maecenas sed enim ut sem viverra aliquet eget sit amet. Morbi leo urna molestie at elementum eu facilisis. Sed viverra ipsum nunc aliquet bibendum. Ultrices neque ornare aenean euismod. Id volutpat lacus laoreet non curabitur gravida. + +Mi bibendum neque egestas congue quisque egestas diam in arcu. Bibendum arcu vitae elementum curabitur vitae. A scelerisque purus semper eget duis. Sed risus pretium quam vulputate. Cursus metus aliquam eleifend mi in nulla posuere sollicitudin aliquam. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Elementum pulvinar etiam non quam lacus suspendisse. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. In ante metus dictum at. Aliquam vestibulum morbi blandit cursus risus at ultrices mi. Eu mi bibendum neque egestas congue. Risus ultricies tristique nulla aliquet enim. Maecenas ultricies mi eget mauris pharetra. + +Nibh tellus molestie nunc non blandit. Mattis molestie a iaculis at erat pellentesque adipiscing commodo. Pulvinar elementum integer enim neque volutpat ac tincidunt. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras tincidunt lobortis feugiat vivamus at augue. Dictum fusce ut placerat orci. Ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Neque laoreet suspendisse interdum consectetur libero id. Massa tincidunt nunc pulvinar sapien et ligula. Sit amet justo donec enim diam. Habitant morbi tristique senectus et netus. Dictum non consectetur a erat. Mattis enim ut tellus elementum sagittis vitae et. Adipiscing tristique risus nec feugiat in. Urna et pharetra pharetra massa massa ultricies. Dolor purus non enim praesent elementum facilisis leo. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Eget felis eget nunc lobortis. Dictumst quisque sagittis purus sit amet. + +Condimentum vitae sapien pellentesque habitant morbi. Donec et odio pellentesque diam volutpat. Ac tincidunt vitae semper quis lectus nulla. Diam maecenas sed enim ut sem viverra aliquet eget sit. Faucibus nisl tincidunt eget nullam. Bibendum est ultricies integer quis auctor elit sed. Malesuada proin libero nunc consequat interdum. Cras fermentum odio eu feugiat pretium. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Neque convallis a cras semper. Fusce ut placerat orci nulla. + +Vel risus commodo viverra maecenas. Aliquam sem et tortor consequat id. Netus et malesuada fames ac turpis. Aliquet porttitor lacus luctus accumsan. Rhoncus mattis rhoncus urna neque viverra justo nec ultrices dui. Mollis aliquam ut porttitor leo a diam sollicitudin tempor. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Id porta nibh venenatis cras sed felis eget velit. Vulputate dignissim suspendisse in est ante. Varius vel pharetra vel turpis nunc eget lorem dolor. Habitant morbi tristique senectus et netus et malesuada fames. Laoreet id donec ultrices tincidunt arcu non sodales neque. + +Venenatis lectus magna fringilla urna porttitor rhoncus dolor purus non. Dictum sit amet justo donec enim. Lorem ipsum dolor sit amet consectetur adipiscing elit. Tristique senectus et netus et. Amet facilisis magna etiam tempor orci. Et molestie ac feugiat sed lectus. Ac odio tempor orci dapibus ultrices in iaculis. Commodo nulla facilisi nullam vehicula. Bibendum est ultricies integer quis. Posuere sollicitudin aliquam ultrices sagittis orci a. Fames ac turpis egestas sed tempus urna. Imperdiet dui accumsan sit amet. + +Cursus metus aliquam eleifend mi. Est ultricies integer quis auctor. Ornare aenean euismod elementum nisi quis eleifend quam. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus. Vitae et leo duis ut diam quam nulla. Lobortis elementum nibh tellus molestie nunc non blandit massa. Justo eget magna fermentum iaculis eu non diam. Morbi leo urna molestie at elementum eu facilisis sed odio. Est sit amet facilisis magna. Ipsum consequat nisl vel pretium. Aliquam etiam erat velit scelerisque. Eget duis at tellus at urna. In eu mi bibendum neque egestas congue quisque. Rhoncus aenean vel elit scelerisque. A lacus vestibulum sed arcu non odio. Facilisi cras fermentum odio eu feugiat. Magna fermentum iaculis eu non. Vitae sapien pellentesque habitant morbi tristique senectus et netus. + +Posuere urna nec tincidunt praesent semper. Vitae tempus quam pellentesque nec nam. Tincidunt ornare massa eget egestas purus viverra. Neque laoreet suspendisse interdum consectetur libero id faucibus. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Sem nulla pharetra diam sit amet nisl suscipit adipiscing. Elit duis tristique sollicitudin nibh. Risus commodo viverra maecenas accumsan lacus vel. Vitae nunc sed velit dignissim. Congue nisi vitae suscipit tellus mauris a diam. + +Eu nisl nunc mi ipsum faucibus vitae aliquet nec. Vulputate sapien nec sagittis aliquam malesuada. Et leo duis ut diam quam. Adipiscing elit duis tristique sollicitudin. Et netus et malesuada fames ac turpis egestas maecenas pharetra. Lobortis scelerisque fermentum dui faucibus in. Nibh nisl condimentum id venenatis a condimentum vitae sapien pellentesque. Scelerisque mauris pellentesque pulvinar pellentesque. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Massa eget egestas purus viverra accumsan in nisl nisi. + +Aliquet enim tortor at auctor urna nunc id cursus. Ac feugiat sed lectus vestibulum mattis. Nunc scelerisque viverra mauris in aliquam sem. Convallis posuere morbi leo urna molestie at. Lectus proin nibh nisl condimentum. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Nunc sed blandit libero volutpat sed cras. Morbi tincidunt augue interdum velit euismod in pellentesque. Duis ultricies lacus sed turpis. Nunc sed velit dignissim sodales ut eu sem integer vitae. Risus commodo viverra maecenas accumsan lacus. Vel fringilla est ullamcorper eget nulla facilisi. Viverra justo nec ultrices dui sapien eget. Aliquam id diam maecenas ultricies mi. Erat nam at lectus urna duis convallis convallis tellus id. Id volutpat lacus laoreet non curabitur gravida arcu ac tortor. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Sociis natoque penatibus et magnis dis. + +Egestas egestas fringilla phasellus faucibus. Sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Et malesuada fames ac turpis egestas integer. Facilisi nullam vehicula ipsum a arcu cursus vitae. Sodales ut etiam sit amet nisl purus. Tincidunt ornare massa eget egestas purus viverra. Ac placerat vestibulum lectus mauris ultrices eros. Nulla pellentesque dignissim enim sit amet venenatis. Vitae tortor condimentum lacinia quis vel eros donec. Euismod lacinia at quis risus sed vulputate odio ut. Morbi tristique senectus et netus et malesuada fames ac. Nulla facilisi etiam dignissim diam quis enim. + +Neque vitae tempus quam pellentesque nec nam aliquam sem. Magna eget est lorem ipsum dolor. Duis ut diam quam nulla porttitor massa. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Diam quam nulla porttitor massa id. Vitae et leo duis ut diam quam nulla porttitor massa. Aliquet nec ullamcorper sit amet. Iaculis urna id volutpat lacus laoreet non curabitur. Tempus quam pellentesque nec nam aliquam. Neque egestas congue quisque egestas diam in. Mi in nulla posuere sollicitudin. Elementum tempus egestas sed sed risus pretium quam vulputate dignissim. Diam maecenas ultricies mi eget mauris. Sollicitudin nibh sit amet commodo nulla facilisi. Massa tincidunt nunc pulvinar sapien et ligula. Dignissim suspendisse in est ante in. Magna sit amet purus gravida quis blandit turpis cursus in. Rhoncus urna neque viverra justo nec ultrices dui sapien. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. + +Vel fringilla est ullamcorper eget nulla. Convallis convallis tellus id interdum velit. Quis varius quam quisque id diam vel. Mattis nunc sed blandit libero. Tempor commodo ullamcorper a lacus vestibulum sed arcu. Tempor id eu nisl nunc. Nunc sed augue lacus viverra vitae congue eu. In nisl nisi scelerisque eu. Consectetur purus ut faucibus pulvinar elementum. Enim lobortis scelerisque fermentum dui faucibus. Et tortor at risus viverra adipiscing at in tellus. Quam elementum pulvinar etiam non quam lacus. + +Egestas sed sed risus pretium quam vulputate dignissim suspendisse. Orci a scelerisque purus semper. Pellentesque sit amet porttitor eget dolor morbi non arcu. Non sodales neque sodales ut etiam sit. Porttitor leo a diam sollicitudin tempor. Ultrices eros in cursus turpis massa tincidunt. Pharetra et ultrices neque ornare aenean euismod. Viverra nam libero justo laoreet sit amet cursus. Orci a scelerisque purus semper. Ultrices sagittis orci a scelerisque purus semper. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Mi tempus imperdiet nulla malesuada pellentesque elit eget gravida cum. Habitasse platea dictumst quisque sagittis purus. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et. Sit amet consectetur adipiscing elit ut. Magna eget est lorem ipsum. Metus vulputate eu scelerisque felis. Consectetur libero id faucibus nisl tincidunt eget nullam. Urna duis convallis convallis tellus id interdum velit. Amet commodo nulla facilisi nullam vehicula ipsum a. Congue eu consequat ac felis donec et odio pellentesque diam. + +Consectetur a erat nam at lectus urna duis convallis convallis. Libero volutpat sed cras ornare arcu. Facilisis leo vel fringilla est. Velit euismod in pellentesque massa placerat duis. Neque volutpat ac tincidunt vitae semper quis lectus nulla. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit amet risus nullam. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Sem et tortor consequat id porta nibh venenatis cras. In est ante in nibh. Urna neque viverra justo nec ultrices dui sapien eget mi. Tempus quam pellentesque nec nam. Sagittis nisl rhoncus mattis rhoncus urna neque. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Tempor orci dapibus ultrices in. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Massa placerat duis ultricies lacus sed turpis. Nunc sed id semper risus in hendrerit. Nulla facilisi morbi tempus iaculis. + +Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Morbi quis commodo odio aenean. Gravida neque convallis a cras semper. Varius quam quisque id diam. Eget arcu dictum varius duis at. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Vel facilisis volutpat est velit. Felis donec et odio pellentesque diam volutpat commodo sed. Suspendisse potenti nullam ac tortor vitae. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Nec dui nunc mattis enim. Arcu non odio euismod lacinia at quis risus sed. Ultricies mi eget mauris pharetra et ultrices. Auctor elit sed vulputate mi sit amet. At urna condimentum mattis pellentesque. Tortor at risus viverra adipiscing at. Ultricies mi quis hendrerit dolor. Fames ac turpis egestas sed tempus. + +Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Duis ultricies lacus sed turpis tincidunt. Pulvinar neque laoreet suspendisse interdum consectetur libero. Cursus mattis molestie a iaculis at erat pellentesque. Nibh venenatis cras sed felis. Lectus mauris ultrices eros in cursus turpis. Libero justo laoreet sit amet cursus sit amet dictum. Quisque sagittis purus sit amet volutpat consequat. Sapien faucibus et molestie ac feugiat sed. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Egestas maecenas pharetra convallis posuere morbi. Semper quis lectus nulla at volutpat. Facilisi etiam dignissim diam quis enim lobortis scelerisque fermentum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Vel turpis nunc eget lorem dolor sed viverra ipsum. Sed vulputate odio ut enim blandit volutpat maecenas volutpat. Cras sed felis eget velit aliquet sagittis id consectetur purus. Cras ornare arcu dui vivamus arcu felis. + +Id aliquet risus feugiat in ante. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Vulputate mi sit amet mauris commodo. Arcu non odio euismod lacinia at quis risus sed vulputate. Sagittis eu volutpat odio facilisis mauris sit amet. In mollis nunc sed id. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Est placerat in egestas erat imperdiet sed euismod nisi. Egestas tellus rutrum tellus pellentesque eu tincidunt. Augue mauris augue neque gravida. Quam id leo in vitae turpis massa sed. Orci porta non pulvinar neque laoreet suspendisse. + +Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Arcu ac tortor dignissim convallis aenean et tortor. Cursus eget nunc scelerisque viverra mauris in aliquam sem. Phasellus egestas tellus rutrum tellus pellentesque. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Elit ut aliquam purus sit amet luctus venenatis. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Hac habitasse platea dictumst quisque sagittis purus sit amet. Pellentesque diam volutpat commodo sed. Tempor orci dapibus ultrices in iaculis nunc. In nisl nisi scelerisque eu ultrices vitae auctor eu. Commodo nulla facilisi nullam vehicula ipsum a arcu. Sed cras ornare arcu dui vivamus arcu. + +Sed odio morbi quis commodo odio aenean. Orci sagittis eu volutpat odio. Vestibulum lectus mauris ultrices eros in cursus. Sed arcu non odio euismod lacinia at quis risus. A condimentum vitae sapien pellentesque habitant morbi tristique. Nascetur ridiculus mus mauris vitae ultricies leo integer. Pulvinar mattis nunc sed blandit libero volutpat sed. Aliquam sem et tortor consequat id porta. Sapien eget mi proin sed libero enim sed. Eget magna fermentum iaculis eu non diam phasellus vestibulum. Libero id faucibus nisl tincidunt eget. Blandit aliquam etiam erat velit scelerisque in dictum non consectetur. Nibh nisl condimentum id venenatis a condimentum. + +Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Facilisis leo vel fringilla est. Commodo ullamcorper a lacus vestibulum sed arcu. Feugiat nisl pretium fusce id velit ut tortor pretium. Risus pretium quam vulputate dignissim suspendisse in est. Sed velit dignissim sodales ut. Dictum at tempor commodo ullamcorper a. Integer enim neque volutpat ac tincidunt vitae semper quis lectus. Vitae purus faucibus ornare suspendisse sed nisi. Ut placerat orci nulla pellentesque dignissim. Eget egestas purus viverra accumsan in. + +Amet nulla facilisi morbi tempus iaculis urna. Viverra maecenas accumsan lacus vel facilisis volutpat est. In massa tempor nec feugiat nisl pretium fusce id. Eget velit aliquet sagittis id consectetur purus ut. Ac turpis egestas integer eget aliquet nibh praesent tristique. Proin sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Risus in hendrerit gravida rutrum quisque non tellus. Arcu odio ut sem nulla pharetra diam sit amet. Et netus et malesuada fames ac turpis egestas integer eget. Ut pharetra sit amet aliquam. Lectus sit amet est placerat in egestas erat imperdiet. At urna condimentum mattis pellentesque id. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum nunc aliquet bibendum enim. Egestas dui id ornare arcu odio ut. Ultrices neque ornare aenean euismod elementum nisi quis eleifend quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Aliquam sem et tortor consequat id porta nibh venenatis cras. Tortor vitae purus faucibus ornare suspendisse. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Eleifend quam adipiscing vitae proin sagittis nisl. Urna duis convallis convallis tellus id. Lacus vestibulum sed arcu non. Suspendisse interdum consectetur libero id faucibus. Aenean pharetra magna ac placerat. Vulputate mi sit amet mauris. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Dui vivamus arcu felis bibendum ut tristique. + +Quis lectus nulla at volutpat diam ut venenatis tellus in. Malesuada fames ac turpis egestas. Et ligula ullamcorper malesuada proin libero nunc consequat. Leo in vitae turpis massa sed. At elementum eu facilisis sed. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Cras ornare arcu dui vivamus arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare. Varius vel pharetra vel turpis nunc eget lorem. Duis at tellus at urna condimentum mattis pellentesque id. Quam nulla porttitor massa id neque aliquam. Porta lorem mollis aliquam ut porttitor leo a. Felis donec et odio pellentesque diam. Magna etiam tempor orci eu lobortis elementum nibh tellus. Parturient montes nascetur ridiculus mus mauris vitae. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Nulla facilisi cras fermentum odio eu feugiat. + +Scelerisque eu ultrices vitae auctor eu. Dictum non consectetur a erat nam at lectus urna. Elementum nibh tellus molestie nunc non blandit. At auctor urna nunc id cursus. Lectus sit amet est placerat in egestas erat imperdiet sed. Amet porttitor eget dolor morbi non arcu. Rutrum quisque non tellus orci ac auctor augue mauris augue. Duis ultricies lacus sed turpis tincidunt id aliquet risus. At augue eget arcu dictum varius. Enim ut tellus elementum sagittis vitae et leo duis ut. Nunc non blandit massa enim nec dui nunc. Tortor at auctor urna nunc id cursus metus. Vel orci porta non pulvinar neque. Lectus mauris ultrices eros in. Sociis natoque penatibus et magnis dis parturient montes nascetur. In hac habitasse platea dictumst quisque sagittis purus. Mauris vitae ultricies leo integer malesuada nunc. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. + +Purus semper eget duis at tellus at urna condimentum mattis. Aliquam eleifend mi in nulla posuere sollicitudin. Nunc aliquet bibendum enim facilisis gravida neque. Cursus eget nunc scelerisque viverra mauris in aliquam. Et pharetra pharetra massa massa ultricies. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Tempor id eu nisl nunc mi ipsum. Vel fringilla est ullamcorper eget nulla facilisi etiam. Suspendisse ultrices gravida dictum fusce. Cursus euismod quis viverra nibh. Commodo ullamcorper a lacus vestibulum sed arcu non odio euismod. Aliquet nibh praesent tristique magna sit amet purus gravida quis. Morbi tristique senectus et netus. Euismod in pellentesque massa placerat duis. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Eu mi bibendum neque egestas. + +Lacus vel facilisis volutpat est velit egestas. Libero enim sed faucibus turpis in eu mi bibendum. Egestas quis ipsum suspendisse ultrices gravida dictum fusce ut placerat. Pulvinar elementum integer enim neque volutpat ac. Urna condimentum mattis pellentesque id. Donec ultrices tincidunt arcu non sodales neque. Praesent elementum facilisis leo vel fringilla est. Tincidunt lobortis feugiat vivamus at augue eget arcu. Tortor at auctor urna nunc id. Tortor condimentum lacinia quis vel. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Nec feugiat in fermentum posuere urna nec tincidunt. Eget felis eget nunc lobortis mattis aliquam faucibus. Ipsum consequat nisl vel pretium lectus quam. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. + +Non curabitur gravida arcu ac tortor dignissim convallis. Etiam erat velit scelerisque in. Auctor augue mauris augue neque gravida. Quis enim lobortis scelerisque fermentum. Congue quisque egestas diam in arcu. Consectetur a erat nam at lectus urna duis. Sed felis eget velit aliquet sagittis id consectetur purus ut. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Dui ut ornare lectus sit amet est placerat in egestas. Purus in massa tempor nec feugiat nisl pretium. Ligula ullamcorper malesuada proin libero nunc consequat interdum varius sit. Urna cursus eget nunc scelerisque viverra mauris. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Consectetur lorem donec massa sapien faucibus et. Morbi quis commodo odio aenean sed adipiscing diam donec. Sagittis aliquam malesuada bibendum arcu. Risus sed vulputate odio ut. + +Risus commodo viverra maecenas accumsan lacus vel facilisis. Pharetra massa massa ultricies mi quis. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Leo a diam sollicitudin tempor id eu nisl nunc mi. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Consequat mauris nunc congue nisi vitae suscipit. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Gravida dictum fusce ut placerat. Sed tempus urna et pharetra. Vitae sapien pellentesque habitant morbi. Purus semper eget duis at tellus. Massa tincidunt nunc pulvinar sapien et ligula. Nullam non nisi est sit amet facilisis. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Cras fermentum odio eu feugiat pretium nibh. Nunc sed id semper risus in hendrerit gravida rutrum. + +In nisl nisi scelerisque eu. Quis imperdiet massa tincidunt nunc pulvinar sapien. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Porta lorem mollis aliquam ut. Montes nascetur ridiculus mus mauris. Pellentesque elit eget gravida cum sociis natoque penatibus et. Viverra orci sagittis eu volutpat. Enim nunc faucibus a pellentesque sit amet porttitor eget. Mi quis hendrerit dolor magna eget est lorem ipsum. Lorem ipsum dolor sit amet. Elementum tempus egestas sed sed. Nisl pretium fusce id velit ut tortor. Iaculis nunc sed augue lacus viverra vitae congue eu consequat. Senectus et netus et malesuada fames ac turpis egestas. Aliquam faucibus purus in massa tempor nec feugiat nisl. + +Dui ut ornare lectus sit amet. Viverra nam libero justo laoreet sit. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Tellus rutrum tellus pellentesque eu tincidunt tortor. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Vitae proin sagittis nisl rhoncus mattis. Velit euismod in pellentesque massa placerat duis ultricies lacus. Hendrerit dolor magna eget est lorem. Sed felis eget velit aliquet sagittis. Mauris sit amet massa vitae tortor condimentum. Ut eu sem integer vitae. Sollicitudin ac orci phasellus egestas tellus rutrum. Eget mauris pharetra et ultrices. Ultrices mi tempus imperdiet nulla malesuada. + +Sed libero enim sed faucibus turpis in eu mi bibendum. Elit sed vulputate mi sit amet mauris. Maecenas sed enim ut sem. Donec massa sapien faucibus et molestie. Nec dui nunc mattis enim ut tellus elementum. Et leo duis ut diam quam nulla porttitor massa. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lacus vel facilisis volutpat est velit. Nisl nunc mi ipsum faucibus vitae aliquet. Fusce ut placerat orci nulla pellentesque dignissim enim sit. Quis lectus nulla at volutpat diam ut. Mauris in aliquam sem fringilla ut morbi tincidunt. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Facilisi nullam vehicula ipsum a arcu cursus vitae. + +Mauris nunc congue nisi vitae suscipit. Varius morbi enim nunc faucibus a. Volutpat commodo sed egestas egestas fringilla phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur. Sit amet purus gravida quis blandit. Nec nam aliquam sem et tortor consequat id porta nibh. Egestas erat imperdiet sed euismod nisi porta lorem. Risus feugiat in ante metus dictum at. Ultricies mi quis hendrerit dolor. Porttitor eget dolor morbi non arcu. Mattis rhoncus urna neque viverra justo nec ultrices dui sapien. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Mi proin sed libero enim. Massa eget egestas purus viverra accumsan in nisl nisi scelerisque. Id eu nisl nunc mi ipsum faucibus. Tristique sollicitudin nibh sit amet commodo. Condimentum mattis pellentesque id nibh tortor id aliquet. + +Maecenas ultricies mi eget mauris pharetra. Venenatis lectus magna fringilla urna porttitor rhoncus. Volutpat commodo sed egestas egestas. In tellus integer feugiat scelerisque varius morbi enim. Urna duis convallis convallis tellus id interdum. Ac ut consequat semper viverra nam libero. Ac auctor augue mauris augue neque gravida in fermentum et. Turpis egestas integer eget aliquet nibh. Lacus laoreet non curabitur gravida arcu ac tortor. Non pulvinar neque laoreet suspendisse interdum consectetur. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Proin fermentum leo vel orci porta. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Eu volutpat odio facilisis mauris sit amet massa vitae. In iaculis nunc sed augue lacus viverra. In eu mi bibendum neque egestas. Faucibus et molestie ac feugiat sed lectus vestibulum mattis. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/resources/test/template/sample-template b/source/patterns/@aws-solutions-constructs/resources/test/template/sample-template new file mode 100644 index 000000000..ea34f5525 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/resources/test/template/sample-template @@ -0,0 +1,2 @@ +Template Title +placeholder \ No newline at end of file From f5936585f5f6103c91a196df8803f7bad65ad786 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Sat, 12 Aug 2023 18:35:05 +0000 Subject: [PATCH 28/73] chore(release): 2.42.0 --- CHANGELOG.md | 7 +++++++ source/lerna.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4177ec862..b94f1c447 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.42.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.41.0...v2.42.0) (2023-08-12) + + +### Features + +* **new construct:** aws-openapigateway-lambda ([#912](https://github.com/awslabs/aws-solutions-constructs/issues/912)) ([09465d6](https://github.com/awslabs/aws-solutions-constructs/commit/09465d65fc5969da5691cf5057c278ded8753b43)), closes [#910](https://github.com/awslabs/aws-solutions-constructs/issues/910) [#917](https://github.com/awslabs/aws-solutions-constructs/issues/917) [#922](https://github.com/awslabs/aws-solutions-constructs/issues/922) [#929](https://github.com/awslabs/aws-solutions-constructs/issues/929) [#930](https://github.com/awslabs/aws-solutions-constructs/issues/930) + ## [2.41.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.40.0...v2.41.0) (2023-06-06) Build on CDK v2.82.0 diff --git a/source/lerna.json b/source/lerna.json index bb4ec9f4a..25990f311 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.41.0" + "version": "2.42.0" } From ca09f8dd2ef58c01037f54c6040e818049c40aae Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sat, 12 Aug 2023 14:38:39 -0400 Subject: [PATCH 29/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b94f1c447..75337c745 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file. See [standa ## [2.42.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.41.0...v2.42.0) (2023-08-12) +Build on CDK v2.82.0 ### Features From be9997a4e7e376670ef7f3d8bf1335ea3cebc515 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Wed, 23 Aug 2023 16:36:25 -0400 Subject: [PATCH 30/73] feat(aws-openapi-lambda): make names unique (#987) * Adjust names of functions and RestAPIs * Cleanup some debugging scraps * Minor fix requires new snapshots * Remove leftover file --- .../aws-openapigateway-lambda/lib/index.ts | 2 +- ...AssetExistingLambdaFunctions.expected.json | 26 +++- ...iFromAssetNewLambdaFunctions.expected.json | 70 ++++++---- ....apiFromAssetWithCognitoAuth.expected.json | 70 ++++++---- .../test/test.openapigateway-lambda.test.ts | 121 +++++++++++++++++- .../core/lib/apigateway-defaults.ts | 7 +- .../core/lib/apigateway-helper.ts | 2 +- 7 files changed, 240 insertions(+), 58 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts index f63867237..1261fde3d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts @@ -170,7 +170,7 @@ export class OpenApiGatewayToLambda extends Construct { lambdaFunction: defaults.buildLambdaFunction(this, { existingLambdaObj: apiIntegration.existingLambdaObj, lambdaFunctionProps: apiIntegration.lambdaFunctionProps - }, `ApiFunction${lambdaCounter++}`) + }, `${apiIntegration.id}ApiFunction${lambdaCounter++}`) }; } else { throw new Error(`One of existingLambdaObj or lambdaFunctionProps must be specified for the api integration with id: ${apiIntegration.id}`); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json index eb95766fb..1732135d5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json @@ -806,10 +806,30 @@ ] } }, - "Name": "SpecRestApi" + "Name": { + "Fn::Join": [ + "", + [ + "OpenApiGatewayToLambda-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } } }, - "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775a5995a76cd028623a8c53fad4d5dfe6e": { + "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775114a8d1d0c9bf9b9d904a22f099d1d64": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "RestApiId": { @@ -844,7 +864,7 @@ "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" }, "DeploymentId": { - "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775a5995a76cd028623a8c53fad4d5dfe6e" + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775114a8d1d0c9bf9b9d904a22f099d1d64" }, "MethodSettings": [ { diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json index 4b8ca836a..8af032032 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json @@ -1,7 +1,7 @@ { "Description": "Integration Test for aws-openapigateway-lambda", "Resources": { - "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B": { + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -56,7 +56,7 @@ ] } }, - "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027": { + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleDefaultPolicy4563083B": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -72,10 +72,10 @@ ], "Version": "2012-10-17" }, - "PolicyName": "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027", + "PolicyName": "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleDefaultPolicy4563083B", "Roles": [ { - "Ref": "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B" + "Ref": "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9" } ] }, @@ -90,7 +90,7 @@ } } }, - "OpenApiGatewayToLambdaApiFunction0260B7595": { + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0E78C5307": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { @@ -101,7 +101,7 @@ }, "Role": { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B", + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9", "Arn" ] }, @@ -112,8 +112,8 @@ } }, "DependsOn": [ - "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027", - "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B" + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleDefaultPolicy4563083B", + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9" ], "Metadata": { "cfn_nag": { @@ -134,13 +134,13 @@ } } }, - "OpenApiGatewayToLambdaApiFunction0PermitAPIGInvocation16ED06C4": { + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0PermitAPIGInvocationB70BC520": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction0260B7595", + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0E78C5307", "Arn" ] }, @@ -171,7 +171,7 @@ } } }, - "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60": { + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -226,7 +226,7 @@ ] } }, - "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D": { + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleDefaultPolicy389AA3BA": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -242,10 +242,10 @@ ], "Version": "2012-10-17" }, - "PolicyName": "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D", + "PolicyName": "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleDefaultPolicy389AA3BA", "Roles": [ { - "Ref": "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60" + "Ref": "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749" } ] }, @@ -260,7 +260,7 @@ } } }, - "OpenApiGatewayToLambdaApiFunction1C23FE1AE": { + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1C42C52E8": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { @@ -271,7 +271,7 @@ }, "Role": { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60", + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749", "Arn" ] }, @@ -282,8 +282,8 @@ } }, "DependsOn": [ - "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D", - "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60" + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleDefaultPolicy389AA3BA", + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749" ], "Metadata": { "cfn_nag": { @@ -304,13 +304,13 @@ } } }, - "OpenApiGatewayToLambdaApiFunction1PermitAPIGInvocation61F651CA": { + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1PermitAPIGInvocationA20E40FB": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction1C23FE1AE", + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1C42C52E8", "Arn" ] }, @@ -738,7 +738,7 @@ ":lambda:path/2015-03-31/functions/", { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction0260B7595", + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0E78C5307", "Arn" ] }, @@ -753,7 +753,7 @@ ":lambda:path/2015-03-31/functions/", { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction1C23FE1AE", + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1C42C52E8", "Arn" ] }, @@ -805,10 +805,30 @@ ] } }, - "Name": "SpecRestApi" + "Name": { + "Fn::Join": [ + "", + [ + "OpenApiGatewayToLambda-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } } }, - "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD077553ca81e8e1b2799986bf3d0ef9cf2ff0": { + "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775c586d865ce613dde0b09710274a96485": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "RestApiId": { @@ -843,7 +863,7 @@ "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" }, "DeploymentId": { - "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD077553ca81e8e1b2799986bf3d0ef9cf2ff0" + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775c586d865ce613dde0b09710274a96485" }, "MethodSettings": [ { diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json index 969f8c03d..1f3a617a5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json @@ -1,7 +1,7 @@ { "Description": "Integration Test for aws-openapigateway-lambda", "Resources": { - "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B": { + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -56,7 +56,7 @@ ] } }, - "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027": { + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleDefaultPolicy4563083B": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -72,10 +72,10 @@ ], "Version": "2012-10-17" }, - "PolicyName": "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027", + "PolicyName": "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleDefaultPolicy4563083B", "Roles": [ { - "Ref": "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B" + "Ref": "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9" } ] }, @@ -90,7 +90,7 @@ } } }, - "OpenApiGatewayToLambdaApiFunction0260B7595": { + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0E78C5307": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { @@ -101,7 +101,7 @@ }, "Role": { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B", + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9", "Arn" ] }, @@ -112,8 +112,8 @@ } }, "DependsOn": [ - "OpenApiGatewayToLambdaApiFunction0ServiceRoleDefaultPolicyE0627027", - "OpenApiGatewayToLambdaApiFunction0ServiceRole5E78431B" + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleDefaultPolicy4563083B", + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9" ], "Metadata": { "cfn_nag": { @@ -134,13 +134,13 @@ } } }, - "OpenApiGatewayToLambdaApiFunction0PermitAPIGInvocation16ED06C4": { + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0PermitAPIGInvocationB70BC520": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction0260B7595", + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0E78C5307", "Arn" ] }, @@ -171,7 +171,7 @@ } } }, - "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60": { + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -226,7 +226,7 @@ ] } }, - "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D": { + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleDefaultPolicy389AA3BA": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -242,10 +242,10 @@ ], "Version": "2012-10-17" }, - "PolicyName": "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D", + "PolicyName": "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleDefaultPolicy389AA3BA", "Roles": [ { - "Ref": "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60" + "Ref": "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749" } ] }, @@ -260,7 +260,7 @@ } } }, - "OpenApiGatewayToLambdaApiFunction1C23FE1AE": { + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1C42C52E8": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { @@ -271,7 +271,7 @@ }, "Role": { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60", + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749", "Arn" ] }, @@ -282,8 +282,8 @@ } }, "DependsOn": [ - "OpenApiGatewayToLambdaApiFunction1ServiceRoleDefaultPolicy23E5856D", - "OpenApiGatewayToLambdaApiFunction1ServiceRole71570A60" + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleDefaultPolicy389AA3BA", + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749" ], "Metadata": { "cfn_nag": { @@ -304,13 +304,13 @@ } } }, - "OpenApiGatewayToLambdaApiFunction1PermitAPIGInvocation61F651CA": { + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1PermitAPIGInvocationA20E40FB": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction1C23FE1AE", + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1C42C52E8", "Arn" ] }, @@ -738,7 +738,7 @@ ":lambda:path/2015-03-31/functions/", { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction0260B7595", + "OpenApiGatewayToLambdaMessagesHandlerApiFunction0E78C5307", "Arn" ] }, @@ -753,7 +753,7 @@ ":lambda:path/2015-03-31/functions/", { "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiFunction1C23FE1AE", + "OpenApiGatewayToLambdaPhotosHandlerApiFunction1C42C52E8", "Arn" ] }, @@ -805,10 +805,30 @@ ] } }, - "Name": "SpecRestApi" + "Name": { + "Fn::Join": [ + "", + [ + "OpenApiGatewayToLambda-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } } }, - "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775bcc848b868cc738d8dab6849b1e56a46": { + "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775d25e717744ab7d508aee3a1c3b7aa9b2": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "RestApiId": { @@ -843,7 +863,7 @@ "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" }, "DeploymentId": { - "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775bcc848b868cc738d8dab6849b1e56a46" + "Ref": "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775d25e717744ab7d508aee3a1c3b7aa9b2" }, "MethodSettings": [ { diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts index 1280927b7..5f80a68ea 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts @@ -318,4 +318,123 @@ test('Throws error when api is defined as asset and s3 key is specified', () => }); }; expect(app).toThrowError('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified'); -}); \ No newline at end of file +}); + +test('Two Constructs create APIs with different names', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + } + ] + }); + + const secondApiDefinitionAsset = new Asset(stack, 'SecondOpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition-withCognitoAuth.yaml') + }); + + new OpenApiGatewayToLambda(stack, 'second-test', { + apiDefinitionAsset: secondApiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + } + ] + }); + + const template = Template.fromStack(stack); + + template.resourceCountIs("AWS::ApiGateway::RestApi", 2); + template.hasResourceProperties("AWS::ApiGateway::RestApi", { + Name: { + "Fn::Join": [ + "", + [ + "test-apigateway-lambda-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + Ref: "AWS::StackId" + } + ] + } + ] + } + ] + ] + } + }); + template.hasResourceProperties("AWS::ApiGateway::RestApi", { + Name: { + "Fn::Join": [ + "", + [ + "second-test-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + Ref: "AWS::StackId" + } + ] + } + ] + } + ] + ] + } + }); +}); + +test('Confirm API definition uri is added to function name', () => { + const stack = new Stack(); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + } + } + ] + }); + const template = Template.fromStack(stack); + const resources = JSON.parse(JSON.stringify(template)).Resources; + + expect(Object.keys(resources).find((element) => { + return element.includes("MessagesHandler"); + })).toBeTruthy(); + +}); diff --git a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-defaults.ts index 02589b41d..470f33bdc 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-defaults.ts @@ -20,6 +20,8 @@ import * as api from 'aws-cdk-lib/aws-apigateway'; import { IntegrationResponse } from 'aws-cdk-lib/aws-apigateway'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import { LogGroup } from 'aws-cdk-lib/aws-logs'; +import { Construct } from 'constructs'; +import { generatePhysicalName } from './utils'; /** * Private function to configure an api.RestApiProps @@ -110,7 +112,7 @@ export function DefaultRegionalRestApiProps(_logGroup: LogGroup) { * Provides the default set of properties for SpecRestApi * @param logGroup - CloudWatch Log Group for Api Gateway Access Logging */ -export function DefaultSpecRestApiProps(logGroup: LogGroup): api.RestApiBaseProps { +export function DefaultSpecRestApiProps(scope: Construct, logGroup: LogGroup): api.RestApiBaseProps { return { cloudWatchRole: false, deployOptions: { @@ -119,7 +121,8 @@ export function DefaultSpecRestApiProps(logGroup: LogGroup): api.RestApiBaseProp loggingLevel: api.MethodLoggingLevel.INFO, dataTraceEnabled: false, tracingEnabled: true - } + }, + restApiName: generatePhysicalName("", [ scope.node.id ], 255), }; } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts index 5a98ed63e..3a52a22fb 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts @@ -284,7 +284,7 @@ export function CreateSpecRestApi( logGroupProps?: logs.LogGroupProps): CreateSpecRestApiResponse { const logGroup = buildLogGroup(scope, 'ApiAccessLogGroup', logGroupProps); - const defaultProps = apiDefaults.DefaultSpecRestApiProps(logGroup); + const defaultProps = apiDefaults.DefaultSpecRestApiProps(scope, logGroup); // Define the API object let api: apigateway.SpecRestApi; From cce1dce78d5a4ff6011242e113dc07c3a3151b49 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 28 Aug 2023 07:21:04 -0400 Subject: [PATCH 31/73] Fix two instances name collision, confirm w/tests (#991) --- .../aws-kinesisfirehose-s3/lib/index.ts | 2 +- .../test/integ.two-instances.expected.json | 829 ++++++++++++++++++ .../test/integ.two-instances.ts | 43 + .../test/kinesisfirehose-s3.test.ts | 8 + 4 files changed, 881 insertions(+), 1 deletion(-) create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts index 18319b5b7..9f01075f4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts @@ -169,7 +169,7 @@ export class KinesisFirehoseToS3 extends Construct { const awsManagedKey: kms.IKey = kms.Alias.fromAliasName( scope, - "aws-managed-key", + `${id}aws-managed-key`, "alias/aws/s3" ); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.expected.json new file mode 100644 index 000000000..16ee3aed5 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.expected.json @@ -0,0 +1,829 @@ +{ + "Description": "Integration Test for aws-cdk-apl-kinesisfirehose-s3", + "Resources": { + "firstconstructS3LoggingBucket7A5DAF91": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + }, + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W35", + "reason": "This S3 bucket is used as the access logging bucket for another bucket" + } + ] + } + } + }, + "firstconstructS3LoggingBucketPolicy14219998": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "firstconstructS3LoggingBucket7A5DAF91" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": [ + { + "Fn::GetAtt": [ + "firstconstructS3LoggingBucket7A5DAF91", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "firstconstructS3LoggingBucket7A5DAF91", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "firstconstructS3Bucket58522C24", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "firstconstructS3LoggingBucket7A5DAF91", + "Arn" + ] + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + }, + "firstconstructS3Bucket58522C24": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "LifecycleConfiguration": { + "Rules": [ + { + "NoncurrentVersionTransitions": [ + { + "StorageClass": "GLACIER", + "TransitionInDays": 90 + } + ], + "Status": "Enabled" + } + ] + }, + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "firstconstructS3LoggingBucket7A5DAF91" + } + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + }, + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "firstconstructS3BucketPolicyC7BBECCF": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "firstconstructS3Bucket58522C24" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": [ + { + "Fn::GetAtt": [ + "firstconstructS3Bucket58522C24", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "firstconstructS3Bucket58522C24", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "firstconstructfirehoseloggroup6E34E778": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W86", + "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" + }, + { + "id": "W84", + "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" + } + ] + } + } + }, + "firstconstructfirehoseloggroupfirehoselogstream9883B2C1": { + "Type": "AWS::Logs::LogStream", + "Properties": { + "LogGroupName": { + "Ref": "firstconstructfirehoseloggroup6E34E778" + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "firstconstructKinesisFirehoseRoleB93C8983": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "firehose.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "firstconstructKinesisFirehosePolicyC2362A56": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:AbortMultipartUpload", + "s3:GetBucketLocation", + "s3:GetObject", + "s3:ListBucket", + "s3:ListBucketMultipartUploads", + "s3:PutObject" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "firstconstructS3Bucket58522C24", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "firstconstructS3Bucket58522C24", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "logs:PutLogEvents", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:", + { + "Ref": "firstconstructfirehoseloggroup6E34E778" + }, + ":log-stream:", + { + "Ref": "firstconstructfirehoseloggroupfirehoselogstream9883B2C1" + } + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "firstconstructKinesisFirehosePolicyC2362A56", + "Roles": [ + { + "Ref": "firstconstructKinesisFirehoseRoleB93C8983" + } + ] + } + }, + "firstconstructKinesisFirehoseE18EBAA6": { + "Type": "AWS::KinesisFirehose::DeliveryStream", + "Properties": { + "DeliveryStreamEncryptionConfigurationInput": { + "KeyType": "AWS_OWNED_CMK" + }, + "DeliveryStreamName": "KinesisFirehosetwoinstancesfirstconstructC62A83C0", + "ExtendedS3DestinationConfiguration": { + "BucketARN": { + "Fn::GetAtt": [ + "firstconstructS3Bucket58522C24", + "Arn" + ] + }, + "BufferingHints": { + "IntervalInSeconds": 300, + "SizeInMBs": 5 + }, + "CloudWatchLoggingOptions": { + "Enabled": true, + "LogGroupName": { + "Ref": "firstconstructfirehoseloggroup6E34E778" + }, + "LogStreamName": { + "Ref": "firstconstructfirehoseloggroupfirehoselogstream9883B2C1" + } + }, + "CompressionFormat": "GZIP", + "EncryptionConfiguration": { + "KMSEncryptionConfig": { + "AWSKMSKeyARN": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":kms:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":alias/aws/s3" + ] + ] + } + } + }, + "RoleARN": { + "Fn::GetAtt": [ + "firstconstructKinesisFirehoseRoleB93C8983", + "Arn" + ] + } + } + } + }, + "secondconstructS3LoggingBucketBB57C475": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + }, + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W35", + "reason": "This S3 bucket is used as the access logging bucket for another bucket" + } + ] + } + } + }, + "secondconstructS3LoggingBucketPolicy88BAA4BE": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "secondconstructS3LoggingBucketBB57C475" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": [ + { + "Fn::GetAtt": [ + "secondconstructS3LoggingBucketBB57C475", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "secondconstructS3LoggingBucketBB57C475", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "secondconstructS3Bucket6D7D46A0", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "secondconstructS3LoggingBucketBB57C475", + "Arn" + ] + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + }, + "secondconstructS3Bucket6D7D46A0": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "LifecycleConfiguration": { + "Rules": [ + { + "NoncurrentVersionTransitions": [ + { + "StorageClass": "GLACIER", + "TransitionInDays": 90 + } + ], + "Status": "Enabled" + } + ] + }, + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "secondconstructS3LoggingBucketBB57C475" + } + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + }, + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "secondconstructS3BucketPolicy4B404A49": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "secondconstructS3Bucket6D7D46A0" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": [ + { + "Fn::GetAtt": [ + "secondconstructS3Bucket6D7D46A0", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "secondconstructS3Bucket6D7D46A0", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "secondconstructfirehoseloggroupB59EDD4C": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W86", + "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" + }, + { + "id": "W84", + "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" + } + ] + } + } + }, + "secondconstructfirehoseloggroupfirehoselogstreamA2E1EA50": { + "Type": "AWS::Logs::LogStream", + "Properties": { + "LogGroupName": { + "Ref": "secondconstructfirehoseloggroupB59EDD4C" + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "secondconstructKinesisFirehoseRoleD4EF457F": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "firehose.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "secondconstructKinesisFirehosePolicy7D9CF702": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:AbortMultipartUpload", + "s3:GetBucketLocation", + "s3:GetObject", + "s3:ListBucket", + "s3:ListBucketMultipartUploads", + "s3:PutObject" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "secondconstructS3Bucket6D7D46A0", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "secondconstructS3Bucket6D7D46A0", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "logs:PutLogEvents", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:", + { + "Ref": "secondconstructfirehoseloggroupB59EDD4C" + }, + ":log-stream:", + { + "Ref": "secondconstructfirehoseloggroupfirehoselogstreamA2E1EA50" + } + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "secondconstructKinesisFirehosePolicy7D9CF702", + "Roles": [ + { + "Ref": "secondconstructKinesisFirehoseRoleD4EF457F" + } + ] + } + }, + "secondconstructKinesisFirehoseB2AED79C": { + "Type": "AWS::KinesisFirehose::DeliveryStream", + "Properties": { + "DeliveryStreamEncryptionConfigurationInput": { + "KeyType": "AWS_OWNED_CMK" + }, + "DeliveryStreamName": "KinesisFirehosetwoinstancessecondconstruct96E71AB7", + "ExtendedS3DestinationConfiguration": { + "BucketARN": { + "Fn::GetAtt": [ + "secondconstructS3Bucket6D7D46A0", + "Arn" + ] + }, + "BufferingHints": { + "IntervalInSeconds": 300, + "SizeInMBs": 5 + }, + "CloudWatchLoggingOptions": { + "Enabled": true, + "LogGroupName": { + "Ref": "secondconstructfirehoseloggroupB59EDD4C" + }, + "LogStreamName": { + "Ref": "secondconstructfirehoseloggroupfirehoselogstreamA2E1EA50" + } + }, + "CompressionFormat": "GZIP", + "EncryptionConfiguration": { + "KMSEncryptionConfig": { + "AWSKMSKeyARN": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":kms:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":alias/aws/s3" + ] + ] + } + } + }, + "RoleARN": { + "Fn::GetAtt": [ + "secondconstructKinesisFirehoseRoleD4EF457F", + "Arn" + ] + } + } + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.ts new file mode 100644 index 000000000..0f32b7ea7 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.ts @@ -0,0 +1,43 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +// Imports +import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; +import { KinesisFirehoseToS3 } from "../lib"; +import { generateIntegStackName } from '@aws-solutions-constructs/core'; + +// Setup +const app = new App(); +const stack = new Stack(app, generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for aws-cdk-apl-kinesisfirehose-s3'; + +new KinesisFirehoseToS3(stack, 'first-construct', { + bucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY + } +}); + +new KinesisFirehoseToS3(stack, 'second-construct', { + bucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY + } +}); + +// Synth +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts index 9c1cc7ea0..53ec03ff2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts @@ -337,3 +337,11 @@ test('check DeliveryStreamName is populated', () => { DeliveryStreamName: "KinesisFirehoseteststacktestfirehoses3F50DF0E1" }); }); + +test('check resource names allow multiple instances in 1 stack', () => { + const stack = new cdk.Stack(); + new KinesisFirehoseToS3(stack, 'first-construct', {}); + new KinesisFirehoseToS3(stack, 'second-construct', {}); + + // Nothing to check, the above lines shouldn't throw an error +}); From 24fe018898dafd4be2d20d6636ad54333da4145d Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 28 Aug 2023 10:24:03 -0400 Subject: [PATCH 32/73] feat(new construct): aws-lambda-kendra (#989) * Use V2 cdk-integ-assert * Add lambda-kendra implementation * Replace accidentally deleted line * Final tweaks after self review * Add missing Arch diagram * Address Code Review Comments * eslint nit --- README.md | 2 +- .../aws-alb-fargate/package.json | 2 +- .../aws-alb-lambda/package.json | 2 +- .../aws-apigateway-dynamodb/package.json | 2 +- .../aws-apigateway-iot/package.json | 2 +- .../package.json | 2 +- .../aws-apigateway-lambda/package.json | 2 +- .../package.json | 2 +- .../aws-apigateway-sqs/package.json | 2 +- .../package.json | 2 +- .../aws-cloudfront-apigateway/package.json | 2 +- .../aws-cloudfront-mediastore/package.json | 2 +- .../aws-cloudfront-s3/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../aws-dynamodbstreams-lambda/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../aws-eventbridge-lambda/package.json | 2 +- .../aws-eventbridge-sns/package.json | 2 +- .../aws-eventbridge-sqs/package.json | 2 +- .../package.json | 2 +- .../aws-fargate-dynamodb/package.json | 2 +- .../aws-fargate-eventbridge/package.json | 2 +- .../aws-fargate-kinesisstreams/package.json | 2 +- .../aws-fargate-opensearch/package.json | 2 +- .../aws-fargate-s3/package.json | 2 +- .../aws-fargate-secretsmanager/package.json | 2 +- .../aws-fargate-sns/package.json | 2 +- .../aws-fargate-sqs/package.json | 2 +- .../package.json | 2 +- .../aws-fargate-stepfunctions/package.json | 2 +- .../aws-iot-kinesisfirehose-s3/package.json | 2 +- .../aws-iot-kinesisstreams/package.json | 2 +- .../aws-iot-lambda-dynamodb/package.json | 2 +- .../aws-iot-lambda/package.json | 2 +- .../aws-iot-s3/package.json | 2 +- .../aws-iot-sqs/package.json | 2 +- .../package.json | 2 +- .../aws-kinesisfirehose-s3/package.json | 2 +- .../aws-kinesisstreams-gluejob/package.json | 2 +- .../package.json | 2 +- .../aws-kinesisstreams-lambda/package.json | 2 +- .../aws-lambda-dynamodb/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../aws-lambda-eventbridge/package.json | 2 +- .../aws-lambda-kendra/.eslintignore | 5 + .../aws-lambda-kendra/.gitignore | 15 + .../aws-lambda-kendra/.npmignore | 21 + .../aws-lambda-kendra/README.md | 132 ++ .../aws-lambda-kendra/achitecture.png | Bin 0 -> 55619 bytes .../aws-lambda-kendra/lib/index.ts | 204 +++ .../aws-lambda-kendra/package.json | 96 ++ .../integ.minimal-arguments.expected.json | 779 +++++++++++ .../test/integ.minimal-arguments.ts | 44 + .../test/integ.multiple-sources.expected.json | 827 +++++++++++ .../test/integ.multiple-sources.ts | 68 + .../test/integ.with-vpc.expected.json | 1221 +++++++++++++++++ .../aws-lambda-kendra/test/integ.with-vpc.ts | 45 + .../test/lambda-kendra.test.ts | 1040 ++++++++++++++ .../aws-lambda-kendra/test/lambda/index.js | 8 + .../aws-lambda-kinesisfirehose/package.json | 2 +- .../aws-lambda-opensearch/package.json | 2 +- .../aws-lambda-s3/package.json | 2 +- .../aws-lambda-sagemakerendpoint/package.json | 2 +- .../aws-lambda-secretsmanager/package.json | 2 +- .../aws-lambda-sns/package.json | 2 +- .../aws-lambda-sqs-lambda/package.json | 2 +- .../aws-lambda-sqs/package.json | 2 +- .../package.json | 2 +- .../aws-lambda-stepfunctions/package.json | 2 +- .../aws-route53-alb/package.json | 2 +- .../aws-route53-apigateway/package.json | 2 +- .../aws-s3-lambda/package.json | 2 +- .../aws-s3-sqs/package.json | 2 +- .../aws-s3-stepfunctions/package.json | 2 +- .../aws-sns-lambda/package.json | 2 +- .../aws-sns-sqs/package.json | 2 +- .../aws-sqs-lambda/package.json | 2 +- .../aws-wafwebacl-alb/package.json | 2 +- .../aws-wafwebacl-apigateway/package.json | 2 +- .../aws-wafwebacl-cloudfront/package.json | 2 +- .../@aws-solutions-constructs/core/index.ts | 3 +- .../core/lib/kendra-defaults.ts | 26 + .../core/lib/kendra-helper.ts | 254 ++++ .../core/lib/vpc-helper.ts | 8 +- .../core/package.json | 2 +- .../core/test/kendra-helper.test.ts | 555 ++++++++ source/tools/cdk-integ-tools/package.json | 2 +- .../aws-custom-glue-etl/package.json | 2 +- .../package.json | 2 +- .../aws-s3-static-website/package.json | 2 +- 93 files changed, 5422 insertions(+), 75 deletions(-) create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.eslintignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.gitignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.npmignore create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/achitecture.png create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda/index.js create mode 100644 source/patterns/@aws-solutions-constructs/core/lib/kendra-defaults.ts create mode 100644 source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts create mode 100644 source/patterns/@aws-solutions-constructs/core/test/kendra-helper.test.ts diff --git a/README.md b/README.md index a634edd8a..e1435c422 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ AWS Solutions Constructs and the AWS CDK are independent teams and have differen The AWS Solutions Constructs library is organized into several modules. They are named like this: * __aws-xxx__: well architected pattern package for the indicated services. This package will contain constructs that contain multiple AWS CDK service modules to configure the given pattern. -* __xxx__: packages that don't start "aws-" are core modules that are used to configure best practice defaults for services used within the pattern library. +* __xxx__: packages that don't start "aws-" are core modules that are used to configure best practice defaults for services used within the pattern library. They are not intended to be accessed directly. ## Module Contents diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/package.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/package.json index d65d5d0bc..2cde88a59 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/package.json index 0e3a3d98d..5b871e7cd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json index a9d48f507..4543f580e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json index 1e5944310..a1899beb3 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json index 9c1d15974..4d3dcbe6d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json index e7a457d36..1294e5980 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json index 89b79b055..29cbab486 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json index bfe7d6b0c..4ffb0dba8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json index 437143042..b329e07c6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json index 2218463a9..51deaaef2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/package.json index 84b4c1e2f..9525ae34e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json index 5ded170d5..dfad84b6d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json index 9eb15b3f1..50c1550a2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/package.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/package.json index 9f77d86d0..c73aed650 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/package.json index cad902f5a..26474d128 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/package.json index 9026addd8..2259e328b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/package.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/package.json index aa024e1ea..188591f95 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/package.json @@ -13,7 +13,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/package.json index 2851081cb..9d952c96a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/package.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/package.json index 256f3b240..956a31d0f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/package.json @@ -13,7 +13,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/package.json index 44a803d07..d8bc6bfbb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/package.json @@ -13,7 +13,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/package.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/package.json index 522538a62..ac2c7d171 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/package.json index cd25a4bd1..9fa3cc68b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/package.json index 30f77cb7c..d715fff51 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/package.json index e8cf656b9..8ce4f820d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/package.json index eb9556ce6..a0e587f93 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/package.json index c5a349393..9d70034a3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/package.json index 4326b098d..625d78498 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/package.json index 09dac2f63..4b572d83e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/package.json index 3c923ce82..843985247 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/package.json index 0aae4e452..ee94cf157 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/package.json b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/package.json index 3785f525d..bd2763629 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json index 4866d3090..131ee75b0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/package.json index 92848fa5a..fa6fc3eaf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json index 2352f07e0..fbd9ce412 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json index 0b8b03760..9d98a9f16 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-s3/package.json index cf6345671..9fe0b15c5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/package.json index bec6499a1..6bcc72d0f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json index 6e3f2c3d6..21cde97d4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json index 147b7e1d6..526d592df 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/package.json index 7082dcd7d..700ebea9e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/package.json index e515a4b9e..e38d88375 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json index 13f758a58..18d769ced 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json index 299cf549e..24bb6fa66 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/package.json index 2d0aa801f..9097c462d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json index 230a89131..89b682cf6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/package.json index 67133db65..a2a6a2c17 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.eslintignore b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.eslintignore new file mode 100644 index 000000000..340869a08 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.eslintignore @@ -0,0 +1,5 @@ +lib/*.js +test/*.js +*.d.ts +coverage +test/lambda/index.js diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.gitignore b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.gitignore new file mode 100644 index 000000000..6773cabd2 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.gitignore @@ -0,0 +1,15 @@ +lib/*.js +test/*.js +*.js.map +*.d.ts +node_modules +*.generated.ts +dist +.jsii + +.LAST_BUILD +.nyc_output +coverage +.nycrc +.LAST_PACKAGE +*.snk \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.npmignore b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.npmignore new file mode 100644 index 000000000..f66791629 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/.npmignore @@ -0,0 +1,21 @@ +# Exclude typescript source and config +*.ts +tsconfig.json +coverage +.nyc_output +*.tgz +*.snk +*.tsbuildinfo + +# Include javascript files and typescript declarations +!*.js +!*.d.ts + +# Exclude jsii outdir +dist + +# Include .jsii +!.jsii + +# Include .jsii +!.jsii \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md new file mode 100644 index 000000000..8cae3fe5d --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md @@ -0,0 +1,132 @@ +# aws-lambda-kendra module + +* * * + +![Stability: Experimental](https://img.shields.io/badge/stability-Experimental-important.svg?style=for-the-badge) + +> All classes are under active development and subject to non-backward compatible changes or removal in any +> future version. These are not subject to the [Semantic Versioning](https://semver.org/) model. +> This means that while you may use them, you may need to update your source code when upgrading to a newer version of this package. + +* * * + +| **Reference Documentation**: | https://docs.aws.amazon.com/solutions/latest/constructs/ | +| --- | --- | + +| **Language** | **Package** | +| --- | --- | +| ![Python Logo](https://docs.aws.amazon.com/cdk/api/latest/img/python32.png) Python | `aws_solutions_constructs.aws_lambda_kendra` | +| ![Typescript Logo](https://docs.aws.amazon.com/cdk/api/latest/img/typescript32.png) Typescript | `@aws-solutions-constructs/aws-lambda-kendra` | +| ![Java Logo](https://docs.aws.amazon.com/cdk/api/latest/img/java32.png) Java | `software.amazon.awsconstructs.services.lambdakendra` | + +## Overview + +This AWS Solutions Construct implements an AWS Lambda function and Amazon Kendra index with the least privileged permissions. + +Here is a minimal deployable pattern definition: + +Typescript + +```typescript +import { Construct } from 'constructs'; +import { Stack, StackProps, Aws } from 'aws-cdk-lib'; +import { LambdaToKendra } from '@aws-solutions-constructs/aws-lambda-kendra'; +import * as lambda from "aws-cdk-lib/aws-lambda"; +import * as s3 from "aws-cdk-lib/aws-s3"; + +const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' +}; + +new LambdaToKendra(this, 'sample', { + lambdaFunctionProps: lambdaProps, + kendraIndexProps: {}, + kendraDataSourceProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: 'your-bucket-name', + } + } + ], +}); +``` + +Python + +```python +TBD +``` + +Java + +```java +TBD +``` + +## Pattern Construct Props + +| **Name** | **Type** | **Description** | +| --- | --- | --- | +| existingLambdaObj? | [`lambda.Function`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.Function.html) | Existing instance of Lambda Function object, providing both this and `lambdaFunctionProps` will cause an error. | +| lambdaFunctionProps? | [`lambda.FunctionProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.FunctionProps.html) | User provided props to override the default props for the Lambda function. | +| kendraIndexProps? | [`kendra.CfnIndexProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kendra.CfnIndex.html) | Optional user provided props to override the default props for the Kendra index. Providing both these and existingKendraIndexObj is an error. | +| kendraDataSourcesProps | [`CfnDataSourceProps[]`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kendra.CfnDataSource.html) | A list of data sources that will provide data to the Kendra index. *At least 1 must be specified*. We will do majority of processing for some data sources (S3 crawler initially), but for others the props must be complete (e.g. proper roleArn, etc.) | +| indexPermissions? | `string[]` | Optional - index permissions to grant to the Lambda function. One or more of the following may be specified: `Read`, `SubmitFeedback` and `Write`. Default is `["Read", "SubmitFeedback"]`. Read is all the operations IAM defines as Read and List. SubmitFeedback is only the SubmitFeedback action. Write is all the operations IAM defines as Write and Tag. This functionality may be overridden by providing a specific role arn in lambdaFunctionProps | +| existingKendraIndexObj? | [`kendra.cfnIndex`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kendra.CfnIndex.html) | An existing Kendra index to which the Lambda function will be granted access. Supplying along with kendraIndexProps or kendraDataSourceProps will throw an error. | +| existingVpc? | [`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html) | An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method. | +| vpcProps? | [`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html) | Optional user provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored. | +| deployVpc? | `boolean` | Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
\- One isolated subnet in each Availability Zone used by the CDK program
\- `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`. | + +## Pattern Properties + +| **Name** | **Type** | **Description** | +| --- | --- | --- | +| lambdaFunction | [`lambda.Function`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.Function.html) | Returns an instance of `lambda.Function` managed by the construct | +| kendraIndex | [`kendra.cfnIndex`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kendra.CfnIndex.html) | Returns an instance of `kendra.cfnIndex` managed by the construct | +| kendraDataSources | DataSourceProperties[] (this interface is defined by Solutions Constructs and described below) | A list of data sources created for this construct/index, each in an object that includes the role for that data source. | +| lambdaRole | [`iam.Role`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.Role.html) | The role assumed by the Lambda function | +| vpc? | [`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html) | Returns an interface on the VPC used by the pattern (if any). This may be a VPC created by the pattern or the VPC supplied to the pattern constructor. | + +interface DataSourceProperties { + role?: [`iam.Role`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.Role.html), + source: | [`CfnDataSource`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kendra.CfnDataSource.html) +} +## Lambda Function + +This pattern requires a lambda function that can access a Kendra index. + +## Default settings + +Out of the box implementation of the Construct without any overrides will set the following defaults: + +### AWS Lambda Function + +- Configure limited privilege access IAM role for Lambda function +- Enable reusing connections with Keep-Alive for Node.js Lambda function +- Enable X-Ray Tracing +- Set Environment Variables + - (default) KENDRA_INDEX_ID + - AWS_NODEJS_CONNECTION_REUSE_ENABLED + +### Amazon Kendra Index + +- Creates Amazon Kendra endpoint in VPC if appropriate +- Defaults to DEVELOPER_EDITION + +**Amazon Kendra DataSources** + +- Sets up correct IAM roles to access data for: + - S3 data sources + - Which others should we support in MLP? https://docs.aws.amazon.com/kendra/latest/dg/iam-roles.html +- Adds each data source to Kendra index + +## Architecture + +![Architecture Diagram](architecture.png) + +* * * + +© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/achitecture.png b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/achitecture.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4393b51a3164b38d12e5b6c7ea0fddb4ea4809 GIT binary patch literal 55619 zcmeFZby!s0_cu&Q2m*qD(vl+G9SSH7(hVYALk!)bl7iA*5+WtiLy4kv$Iu`R1A}x7 z@tlMA{r&oT-}lew{qM(h!3=ZG-g~XJSA5pm>r8}(+S6M%DQ}{oq1{qckkdp%!(>21 z!}x@Y4Se!*a?=cWL3h`D`WUUepLzrM$HGcq(OOj%?IG|U7Y#kk4h;*u1^A@|e$mjd z;@+U)0Iwv#uSO0!8Yb|H4qnf}`1ejsh8)a)-(!3NuA@EDl2ud$UbSAhSy?%|+d`np zk&}0Uf#Y`C`cQpU6|ol(C$8s~5DP0VZzmUU2%3bq81UA~3i_Ph+sV<{UCdjO;rb3S z;63;;Hv|3kEl>wZ27OfxdRd5@6}=D_4;K%E)J=MNdI>j6YcWl^C;tow{*z>|g+g7# zxVgQ&ytushxgc&f+`OWqqTD=u+Js& zGd(!(a|?(ERFZ)KT-2QbHnp64&?tzpngu#lJ@C|97Ma&;J5GP1?zFe$)&5Xpd%7aTqze&j6BAl$%qRqfEN+RM7lA{-GB@pF#d^NzemWaQ14 zWW-qHN&VlB#Q3lFGgbmpogC9MGxx-^2fpw_M0b2zZGw+eM;6an@bJ*Fh-J|J{ezn; z82+_KTzX<`zyhCZ;NAJlcti9_>4_t1DAxjS|7G`>=os&L zK4L}wcPuy~ad^AoTldz#?Dtg&T8P43Z4CMUj+LPw$HJAfDErx9_OCVrlzx*5mSG}z z7{c%$_W+RN0FYCuyEMc7m)Cd>xC9dHM48)vxsGr_fE@i2S0u%MolXc3F+DL}s8SB@ zU*xo>0pyg9i5y4$*AdCw#U&1Z^@v#m>o0OFQ~`3v?K4pF|8+j}1OVONa!4Lv{6$VB z3qa2QWifhNY`^&Lk0TKlC)2TQUnY>z>Ds zmd~&Vve!jwkJo0gJ^dpJZxGq)@IXR9c74v-9Vw!}d6Ml3#W4&$~Ox!$Ky zsmCqu^pftJNrshou>aX53@jiT-Dp~4z9yRD=GK5(o|VIv#Yk5uyl||X2Q(nCvB;N+(u4H)8*|JMoQ;UKTuC$ zCc!fK(3+^!LuDemZ2}iQb{iDy%HU1UimW5l`utSG;?fnk+*nBrnx(abHwKwfj7K# z#YN0Jf);;mzo!Vv@0X2KZ_AaoeYw=#3!%mr}YHq@OgTV5!!QMWcsY``y z>)xC)$F9WjvNiM*kdTRpXi?UQnI1?s22G{5sHAM(J+P>Wv0CkMwz`{0(&oTTcO!J zqkS!Za(gVQHE!xySXh)ro60^ZkaG-DR+k*LlgK4W5vcWLr=|Loe%U;CQ35Z{^VD_N zeJDs_G5>z4_Tv+kJ23 zl|T(FAyO)1tQ*OsM(r3oBq;l7Uf*kCNw!j}BVe?gE1~@b!lr)@?pv_TTA{G=oldB} z2{Mf?p3}0J-NOu;9%#VI%5hs^6<_dKHVv7X{!zjl2VF}zUBOd;3Bx;|iFR;oiar_C zK5I8>&3YQe`pWj{VNb;vd2<6zJ;k-S3)FuqX7e_fvJ0i6T;xj_Z(oEKYqw7 z4Y9Fado_N5u)dtnAmk3e84`*)c4)dd9G|zCv^l<0dwe_lJ;%npw2lNLO72I1D=DZA z95<=YU>xK-S$#o0%>l*KS;|?u`!sgtTy#IB1I`BZUma!9>#@#~m*d%UY~p8Tpt5N+`ms9c2@u7UC2svYm( zgUpD9WCl1Bok?zddp&t<#?_@2*64$f-WKd>N&1v5oxG_hMPU-lXs@aH()-Dp;$HQy zIR8~!MKP|{wz9FbN+uj=s>#r! zX}2EV4#zS|I0qcAF5nj|YE~Nn@4HSOVvfxqMw`EesEb_doI5i0|B>jnFm98-T6Q?= z261Znh)2H27q^Ax+iFlcXl4&H9P^#__f^JWQM>!V;Hq9Fb z?M4Ej6D#osF%>JQJ*oh_NPG7g#9r%S;93S=W)F)gqN`pXA|DD8%^rIic;)wp+kQ=u z@JnD)y~h&KK}bCCIcwP5{`tt;-nwS}&2eN>+Ddx<=G&S@lhz{HoE4W*6+Hpj9MS$!*k57v;dXV>W{4sLz z<(;N`p%l{|7vE`A=-otUjzIRDDCmjp8p)o5cr%k6SC>8xHLQxPyJVJ5=O*)No!R#Mw&t#nMZl&s%1C;;btgfSx%$9be^@5MTGi*aGk=@l!6)sjh{rRa<;CbXI z$K(W4#djwKk-X#sUz9WxR~KVoh5Av}ImL*fHnd)Aswq|`zfYSQ%si=egFWO3d%mjy z{)qk@>)`(Mwyz~jKxd|v!SQCQgu^S#S)ccSgKn_eOVm{yi^^6^Ol>al{6TK#Sw_U~ z-0luFQ_ONrxMeQExQR3G7qjkU6nH?Z94KYh9?fQ_JREXHM&wVwF)w1U*!wNU4xaU( zpw+*bv&fC$+MvR*QXD1a292?S4aQ9h_VjSmTp=xa$u~INRl(mn(i#xCEa6*2^=jRh zuAtRN>xg>)Dck8BzGl^W$!aKZ^T&Ivn#YrBY*z@9N%2F7roi$2Av^EP1kdksT>+O* zB6`$3glf(j7qh%nYY%5(n*E}%u_aN^`N+^$V^oK~8c#3zQqj=deY?}Vh@vNJX$dE@0lK>`} zq=D2o_{Q|dNAG0WlhaXKVczt5%Fk`DO0O9R=PUO0t)a;`y^OWe+RcFexXE=%yUzZPl#z0eEt0yf&o3UJROGK>Ieie9FNz0IEU%Tqa3!#7LjR z0^7pNMu}Ql#&^aw$>`PaJeS0sSKf=v`*8RCHKX~21ow_=%2&25l(v@XyeyLQO{ye> z9RDNpYszek0|H_P;gm4hnq5!>l55XKK90F^@TAq7**~PzCO+mG+SKLZSO=#|b6IC9LX(Y&DKkqqUz$(7_fg z#?HCr8{@|UDz*Gk?AyK!c(QKHK2t7=QV3hB@b${6$f5nWMk`|tScxba=z|cf=)@wn7qP#xZvM=owz&$-N3#c24@)`u-PRwGk5U=+qc#bgb zQtL=J>deAsHTUB699~*FR9AYQ}C5Y(H z*EtH4{{orH{BrfCqrlnyLZETipg3;-WGqggK`Ny;;fn4D zn`F;nYLWvLl?P)M)p}P4)DQYWDRlmTGN}oNNa4`dM$Q6nrVHspSTgrz5O-?Gn#WPV zxHQ-M_R5PbhxryaHrNUJv`GnPNxEL^-s`P&pX7COFV(5Dcqc>M>M=R3(@f=jAo)NU zQgEn9p#}*oJYRf}UR3Rgj!(-JnwabY!8KaQJA5D!%*epM_E4msU&yME?=}z1tH=z} zuz@(=oSbV^+sV3qc>Jbnu^u%aE$Wp=U8dF=R_4d-X&aI za;}x-r|Jwl@kQOy?K65|_A`}iGQLO{LY$n+5z(kuQheTD(BGqW zQ4T;8+s_{qZ5ASToM0bPfh`zzi>pl%NQMe}+PtaUykY&TBebMc*o$NOkDYN7PhB-X z4hk~94JcK(7`h2fleOzbsQ2Sm+Bo07SMTON*vLVSeQQeU8Y@VNu(8C1n0Pc?h}Jvt zv&|fdpZAZA$L1^I*bEw)%uA|P9YlZ3ZeZu}%lssKQOkxbjC?BPX10%U?N}wilE4Sr z2Owk`GF~=$TiU*EdLuVl|Jp-a%m$Mxy{c~`w{yOT3CNlpl`|m%xu~W9R|}1 zCz6i_XEoZ*dkvDhboEtNl5m2%czpzhuBmL!_cF)&m;A=PQio~UvN9j?NSizuQtYqs z;7~AEl5l;;l>JQl^Q@T;q8vivO;B+SVPR%Kx{E>tlYn#6kUTiu?Fq9^OcT*}qiy;| zFsiVnVY)5G=JH-^oH@2TQ|o^#Tx+y)av@*snn^wyXk zgZcc%qHLE7XAJ$Q{!7B%0lOPR5}8T&g1U0|MBtwUUOYZhy$aKos_dR@|6{Q{Ky3=I z>SnG8Xg+>e2h&#yU)y-TpfcpYEGn?E*gu*xxFW{dZ)Zgy`C2P<=ZI41Z;Co za9@V9m$1@0j0@o{s+dNQV#DAi)1TojG0N(3ujUT%ANqQYSFkP8LVwH8QZ!OR7A1i# z4wku#_o`6V_3kW>JeZ5+speRBJppqK=CxdQrsp!X?FGz=g$DXOOC9`jIPs{Xq(-f+ zTJIe-;i8{7)LT|Mr!$m8y4b272%@r%U%Vl)s)Z=+zNa_hBz#iVmDXYX3VnO3hbXaA zo9@&PGt?P^+7d6$8m2c}m=;`ky}^7%?j2xBSUTkLU}egXE?T zpIgQX#%DfwA<)x<_Sn8}LoQ@{WdCF>66i2%dDF~i7NDyzK+hbmT^8TBoUaxyI7fOF zj91?|K{WNzPN%;0&76uwz;_4f@9(~PB-Ge#qZ?I`-`%2?DybA#NPSaN3@XWwufIBA z-B6@EbKHUwTX`uP#j4v{*+1L=#}jtm&XH$w+l-6@y)U5QMvX>FK|=GAx*b|6EOBSY zZ>>|rpc?$*7(${;(iux7StgvYZ?M8@DpsZ4up5iqWl4MD$v}z-$00Jff@vT1ofW0_ z*G-6)nY312?)dLgKWp{20K!>bNK7Hq2<4(<#f5kJ`pKQ^B8$v2SPk{@coG4olb(1d zeM)O$BZ(KhZ7;D2R0CC%-?Z+=+MN!L6J5Oj1jB}x`g^`TA?(jebeq%n%5B?gOiHh0 zI5a6B>D@AD7%;W5-rbyBn9-g0UM%RK8%P|DimeH=C)PgSUh7@BlO2$~`+dWieB~-| z;NLjVNdnYIO3(7DK^@b_wRO>Sg#_poi}1@PVH4H@`@@b?9-!Uy`tXHl^-A6vRh`l% zSw|FBIr{K76YrnPipYIorKuWL*wZ^f$3AuJDXa0&MRPB+#S{NyLGEj($e>K$57D$F zOC1IU{GR=D)xh?9qmw7ha4xgvITW{IC*t{W!sR6=+tr8#O6<8ecbCuBr?a*_oPiRQ zeXO?BMWr^kzJv7~UlakY@kgE(Js6X!_+tQO8bV!QgkRvx!jDwD)J@-ahe=oOkjAWA zy-b^Cx?GrI_WW@AVef}}!HLm8z%B-W1&fpUQEr(W&Wv_;>1g>h-__jlY?mhwZ_Yy9*x?!7A?xh1SN zXHwv{kW`d^)ZFKp%w?Z~+T>ikXWXj)Vw*zz2mhxEs%mZSD?>u#{gl2cSJSpYb$SxV zXM3_}A^K!MRiboU;utJ~U_Ht?>+`S5j zMz9gQy8--E#$m$Oe(@JO00d9QZ!rS|Jh&5HOMbg3vU-K_Fz-c1ou=#6O}5h&hg;YU zem@VBmkk)1HtPKqc{r(D3!@UTNx+(~jiJb=WaorUVR#g^ajpr!a+aj#mrLK=TZRYC zUWh<8u`4Mr$@lqPvdpMo?95X9@?KG1)97rlt^2!a&gLeGwzoGP8tlmf-2b<>pJQ|* zPmp*hWL@$Snw4)N+ICnrt;tl-YDfR~4~j!k6lHs?-3n(#_2#`5ON5y3 zQD?G>s++Ro;TXvRpw#keELLe7=SE1_jcvgYg~111xae3G#z64;DUCKG1ponEdV9?G zq0x4AYPC_sKbcwTKYLL1(jRu{DUOw7M|o+zZ*1Phce<}A=24$-DmGV}vEIG?Holxn z6Z+%(;=JCFxt@Pu?Xr|dnRiU7nOD1+0Xt61Zi04eOKqELn>SFaC6M0(K}N6sW9z=f z7l5wgzEY!~!n~b$5WT@FdFfKlr25h9H;)Fq@q^rE?_HvcGDN!VSCZ^>7BR*o8#%h6 z;$X~pFRxS}&S(xpvX%+$D^R`_TR_%hM9F1&H#z>HXsjuxB95LfoID|pu9YK^XlwvR zmIARcB@Kr@iFF5Eh%8XL3FGj74Xh4rkm0~$Ahg(<{J^|44FKy2^!`Gjt0N@G`f zw1=8Y)~sStr0O z8GbTUX2jvuwd z-`6C2BTfg3Y}UMpvE$`c>`1Y^Sh7&O8oz^*`b}iA(!6}6H>+`(DZBhSx}U+-cNg+$lm-wZFW6O|r2z964wgSTJOM!oqr8myw~j z1UB~mhtl5xe0)4fXN>StG+$3OuCx)u)Nj0Nd8Ldht#|0j^*;scQT z^GEEP*A>UX+abedEnHyX!}_7GpYP`B5)+VHF}0PllGqg9=s)i>Kt2wuVXuo2{mhvB zi~8D0auNTAKFYEL!88yeIUte>Tp$wu zV?)I2o*`*gW<7IkL5bB=EJ{EXy4E8f*<)h;yqzeG%YS0KpaAV!68|~N&wKKi>5vu3QxWfdt@O$Jgo1pDAThfFSb9?uQ1)f5rmv%m8paX%5MLvVUf~ z)>{>zr1!1b;sN|DyYw zHbA!u`x}eD$>{^g`M)einT+{-+m=Uv3miC!RSzbA|GR`#>AF1dk90>tb^^%UL;q$c z8(`;T43GJ5b~ZtFS|S@B{mqU#z|Q&RE0Vw2IRw~wX7*!-{y#E9!}!GtY(t>O&RzPzSGE(y5ba*Uz?h=WfsVx=$ZGXl>xj@Am2P3^0b>oUnEYMs*0&)}^|q-r9M ze2M2hBNF-o(eBebFzzBVose>vy(MwC$P}WMX1cNzKJ zz7CRY1pHH1>rE{V>c0!g?^jySAK(L08Z-@=zq&lmBT7o^?&(>XaUXDkkWGAngJEU)(E1oApaOGGATc2U%7ot!+B?vb5v9=C)c|ZPma_RuccL?K zo=?m1oZqcE9E4b9%D_O-rTgi4U5i!dJE?%PP8zS7`%x6!wJlS7(4$Ekqa=0di_t(* zIy<7)i?c)b(AbrpWMQKpl;K!~KX)<%l#@6rxo!H=Rvhi&J0RD4hj6nx1U2FHiN_;A z(DHmX$#+)tmMAUF&$34MEYxpS4I zr7o%SGlqtJ^J1@uyJx#@-Z^&YV#=4qPO&lB&Yp{Sh)Z{B_=DZva@WzZLq)T75YFZ9 zO0rpG?PuFfTY8cdIxvwA(I)|*B*&Q0aiq*0Jlkwv8oE5YqpitWqomq*5@+il_QIsk zAMx??Q_YmY5jFFxh`TreDdnZ5)tnE+q+}YW*YAe6x6Apdd3e;6>Q_FNx;%N&H87B@ zr6&3#Cf4@duQp-7V+hU;6gN#_3W=Y@KvhS6Bb9u#2)X zIg)A~hld@%daS0}L^^8?Y;8Fn*L%(RbhN0c zs@A|=J#9~g9Vg5Ys{6Wr+n0iN!%Qf{Sa&H3Um8_k>9f?4fp^%!A;qPoDgrX210gX( zq8s_~Y1E|NO@ZVd)X|imVoilvSy_J*n}V@$mfQTSFAg-Ya8e%30*^D6AY zhkS=Utx^(lMR#=)7Sxv}i1g$iZ_5hWu7Sg*4_@QxpYvPy+G+|Np8X;US{H6B@N1$) zOr+rWcs1^StNuB0v5G!DX&ID`)&ap#JvQ!>m1bnIb*oFQymO>KlGzKv&}y8;GQPFP z%PHfD$`EyTlq@VNnm)FcPzYV(YCU&roF&lqs!Lz!g}l7cINN};R)=@bsW(M1*B;;PuB6a_DD+31>l$;n$ zzKLBi`Z3EkxR#SHsz=nSh|E^0pkC?w48I?#(rw1Y#cj#%rtrR)!KwZAJq)E<^2&^E zkE?zGqt(uCH$4fbF=#O7k+XTOPZ}?YXQPx{I^^J@ZqB!)Z$Q+P4tJ+vjn>a+#9~o+ z{-f|IFDBxm@W%J%OF_8t(j9mO`s@8cpV4PePy5WRuXOZGR=jLmv{wtEM77>CzdQvf!fk_JU{_B!jhO`;hWIVEM<5SJ zrxj`Np%v%fPjYu)79J_ZL_3IE;;vt9BarVX?s`-;Q?sll@>bS}6!h((# zuT9h&DrZ~ZAo3j~b|mLnJa%}0%>m51mh(zgcy<{+5L;zpmQGIEYR9{4=K6!|(zMxk zGJw*2)9=<7K|6W}L#HjNGKgT~cI`B!zqP>n;GL7xam4zrFHmewq0-;<9I>#CT_XZR zAT@}7bIBiI0;kZ*GOhRF5bwjb%@7<~mw|xw+_0Ij=C5H;NqRu`MzSgtcaJ63rak)9 z>C6RPT!x#E=MbwK)elmTyvRdAb6k}|M9g$vUfb}m;j=@8lXA2v9GbnCjubv}86oQl z@E(QCU>e=59(&TN19ul#7{)PF4G9UC(iWfgm{$+nBR!^7@uHa>wSb|Jjk7PLPZmPS zW5s7;Rxxe|gpc#3BdwgHg5$$dX(yTsM-~U)%UB|38ieRZ5_=(q-#ot5aatEnC;Gkp zD$`ETT{kUA?-93gv@%{1AB)XoczJn&5)Ye{d0e*-T z#zTMC#H%Df5gj9O#cFu-leC#9!4J)o%uTZVG z3g3@SR%DD$QIZX3S?;Rjj22i1N z=Q1knaq-PGTF)__90x4m+kAz^7!2*wr3uho_-}~NvC^3^%EiYl4f1lOW$fN(5xGs; zIpHKm`yKk0)I_#mHzm5HqGgKqLl8Bx>KApj?GOV>Q`&(=-&H6I@7qdj(D{dGO2KYJ zvEr%L_H!SEha!xRU$rm1d#5C1q zM6fg!uRByC>u3m@ET1QrfNKojpnY+C<1*Jl0gHvE3CTo5K$~*l-~5J9YMf40OhZ2? zBR{lV74hccbp1o@))^&CJv3r9j!<*_3&Px*Cb;}jxKyv0A`Y{|@M}sc>E2CGNj;or z>8=kwZ#UVE6mD3jAG8_l6R4!so$Ai2{XopfE?jZ-}ER?g5>& zN){B=p)2*cb&Dopen|e}0DZbzW}<083{lDgAEY0PHn96*f_T;pkaZwMjE& zJsFH2)xjj?r|s(hQjmSmX3DgTmGuG$6S4clzKH6kvq>IK2@AtVGXb0dLK&FQaW0$B zf#x||Tf!z&j#>SFCh#AMZ>7J(Ojvmb^AT^~U86&=XliW#(hW!n)3KmKLTkB*2-Ym( zky{0AvDo+14%+mL)Y6ngsu(u{`TM_1mNtBq$ISSts5dJVI<_4O>whR{)qRI|31>^7 zHVidxfXQ}YZ48$fLTvV$g_QC8()1aP{36GK8nU;XZL<57?mu;3TMupFe~}b85>$Uj z#3;U&q?)-VsmNVAExG?>)Yz>SQHP@O(f1^;8Es1EAN<+}O}2NlyT#|BE1)_B%RgMI zE?swY4C%sCfgW+FszrrY&58o3FS~}5gmS^Q=tuRz3>zS?ggmxZt2 zX{IdAmImr*7yRECm6WigR$ezrJPwh)LV5m@@1z8?u%zHBPX(hr{v{emiu9iy_Q~b_ zO#Hv6)W$w(wIb)5r=^w=!U*dmHeSrPPBO!qms5#|hPAA!#u}8G`@APYwu&X-fis&Z zQL$R^FKQd?m*U*w2dH*Z^=gx#gXLN*23S_O)B+-4z3#G)c`XoXrp(FLf3eOxLK`EEA%bRENJp--iQK6IfNSuLkk-dvNm|QV{u$II=f{!6M zm~60In7irs%YciEoglMnl#;u2zlHzQVV6MySIVoY6=nFFL7WyGRbk%koeH8#$`e~N zf0OTzw3d*$GF~Jbx$MZ5+_7xE&sSIoB+>ynEbYhmVA79 zms|ZfjpR=iV)G7NTjj*^pdn*7yl;&dRp*G9<|J? zEgNZv;ah!pZU+);A_3c2CLx@3Q<2Ni){)@PuER*PvwOoyNwoz25Pzv1Fyn9mTb#oT za|o`zX8;;JpWO+et_&PqieI2=5E=`2Unlk34S4cfeUdb$lfX10IG}Q+Q9$;VuS9zc zF7*mD)s`d%xp%Ex2DxCU8q8}KL;?d#(Pr@%c%#&P!Y)=3H zXxN0=7-t@_013D|?rfV@ZS|-_B84q<+wX7?a&DwFHKt_qWjLQx!8(BKSmV}1sN>r} zL+drJBb!tE^!n5@x{UV-MmS`v{eO*;+Jli%f>G%=}uzk(@zO^T?J zYCUb;q@>ZqCX>~I7pW=khKpq5Oa4Ax%Z9jYMsc@15POjlpE2;J#S4~bCn|W?4TGc^ zqDr|XnjH{O0T+rQ-Bg}FR5pSr0QCVGxtl3hSYSh@%mjX^VU5yLgK0XO+jZZ`4E5?f zV}yyiZjBqbjAOd?!#%_@Ui5{wR80akVZQai5zby`exf(X-9oDO^D1SV!hp|Yi15wu z39dz{Do4yiN50?>iJl@LCKL?60~Q=cXnIV)N56K}a}u79L9wc5IqDGz&u2}$_w_0S z@{g4pJ+Yy=%`cwN$ocy<*XT#M&t4ZRrf}Vf;r_Tz4`z=w?Zm8~d#%G{ucOwjJv(Qb z+xrXK(m>)kd#=JB;W2V3B*5J_ZGbl1)eCKPj}s zWo!F0V&eEr)J;lR`eH+UcE9(a8(DKGVL~Jyzgo27wKwvE(xds_S~C}c9d_^Z3ru*I z-TCP_CbDT?%`XcE9#Mz50HLV;JPK%c4Easr0vop#CcpUEQe&z6jXbkYDLzn^Rz$;K z-!|jG$W^s(+r3t_74Tw@d5JuasQfOD&VZzwJkw3DwGF;4cB728#3aVlZ@Y%YM@V=z z*VU)G=221Dn4Lwdj?b+^YYCOEfq>8TTDo{U?=T0JKDJ-x zJG`*vyK-%CaI*EP2I?S_f#UNgR6c8z{SZmLMoPP$L9bSnNuz0GOwco7Cwac8{jTps z(vJHhFES4r=P&xpBXT*h#R?xc7H`O5PW|ZHc)T)Gm-WHpBPSP(JlfM?xRR8`<@3nC zJ$?j#y0&>khJ)ym+(ENi2g08=lyV_Gt1dvjF6L; zNoNkq#Pg3Unx)H=$s2WN5`)rq9ka$$XLuJcL~9;VMVzz!u_>OS~}2jLg4kbbt-60R=)ahyvl?pAM=46L`LK6#-cKPXQKc3bZBc zzghmz2jHb`ppV>+^={aoQ-MF1{{NX$B6Hv+HK5o4e;+A+qb?Q?Y0h^yA$A9sgMrzi zT#`Q+1Ki?%T^E+a9|7dwErmMY18%l0`Pyna#nc%2si3x>RdBWFvQB!T+05P^Q3oGC zwVJtYus1Yy;nZj9+-i*#qL5xA0v0yIxqvCwKdB?Hn*%?|TxGHC&4^D=C#*HZ?=MrW z5hOz9Pa_;TI3R}^=X1q;9*zULu}f&6z(dyWm`5u>$JxEW`ZJcidB0*nK{nnKL*>x3 z{BF)Qg7^9D-lsom7?~Lbb8EDg_wJpN(9yv+U8%3dN1O@Pl?^Ip$UuF%gRcI#X~tzW z=lg1+`OAoGW1j>j)^Qv<%KGz@$Pa{mYG(XgmOovaiTnt}fd~YY*o^>a0z)J>f|3y9 zj{?O*Z64Rf^ZoMizL4H#BvHA(pch`acGXJ3q|DWy?3kCZA zUYEt#T-1v0^^8*wK3C*Fp*7W@uL%0A>~DQkvN~M!SIIbq zu!vw6DFmkl@x)0rRW!G*SCZ3gPxYAV&x!sP@KjH`nu&W6==jsIy4exSUGlH@&WE=( zovhmtx)wxJ(K`gEmp z3BRsuy5x9*p0%HVEY(wmTijXB$Q%qWK$kx^P_@4B=%xA7xiGllV-^4@lK5g?l8|OD zH43`3Rr9=w}9IX=DCI@@w8lLacHb5@P z>sBm!2USjgHpp5n=e%kAN)uZe@1?s_gC35};H1jUIe*`)A7xlB`Qn|ipo4k*$Pu|- z&qx%$)g`LYkv*E0=dzQd!EIGW^k=E+<39}`|6{4DuVL1^ZH;|-uZ=u)rrh5gD#xd* z;CJFNx~KJhaDfz@A7pVam+#OrZWM1DMQ%a{oD!&3352vzwfbFXUaTi` zVjePR61XK$<*;!#Zez($`SG`3p@lAublqU9Iq+~(u*~wi8x^4aeI%P`ZZ)Jes@E|! zdtSIG7+;Hk(Nm~wLtef^k4qYM(<^pC9|}3Z?-lqa7Gr7itcEj*D^diG#Z;xX&M3yr z^XFXh3s9M1C~0{BJ~{<-lEpnAEcx4FAd%9Yx8#T29)JH>NEIcT)0BWreQ@> zwSSSs(WtFVjM$5JLH%G(a%zZbxz$e<@N>B0> zXobb(*DMdZ`q!r(9X`YBRs|1X?gMQvc((f76ED3)VlgM)zc7bI3q{&_0qAs{{tMRyvoc-Dzw2H~#L+HE=ZdEY16 zK`_0zw07pd_3H7>Y20k&1n|p@h!5}R5p&e-UGk1)IGhTOPY*i^5rRd@oQ&& z1RPUV>qRet@ZFhw!a$ojwyAO~=Ee|?BMqtRQ1zu-S21Ra;HOmBP`SNW&-k}QKe>)U z+cZ8QKw&UfK86g5Iv3u<76PUB96T=b)Oj2NYT@b)&~J6gPj5vod010U%Z;qq#@xen zJuH0`_akR(bqJ$&)9|4>=NwB#YK=DZ;R{vP=w6|c8lnVVSwAf5F6C?TG{9#eAE!Ei zel3%DaO{Vfe(iTPosxN@miCoBQ|KX$2|B) zc^F`b)eH;5n9@n9KhBVXTD#8kdRDQtf)8Y!#r(pf`5j)qd&#cxOox@bxlt?2&!&;; z_buMgNe>N_z{p-g&WD*lPiZ{@+9>eE*zSQ|h=xMHDpwyF=o9Z>Qx;hBJ0w7JWok0i za*DTEEQ`&iRxzh=oOOSG-VWwO){VpzJj%GVhRrvy(5L$NLlh6%>)7ZBuRW)2I$$W% z86u!2u4{%=)F!6>z!i?Fx@$H-t5_Q~m=V8s@}xz1CEdE*WO44?Hdexl1^dB_(LBQ# zJG&wmKR#oY9Se?vnu@J2iP1F-nF81zcIHz9W57$+&jFAEiE8r_4#S!b>$I#m?C7YI zf4>XByy#c+$>^oTZ|v9xSZ)(6@13k!M~dSHBt_MSH6>`elmGOW zg2%QeOyI81(&z9COFENJ`%Olx4&uzosb^$}H)Llvu<^genQ{IYN6uaR!V@~AP*&k# zgwU&i2k*WtzF2vwb*30w-A+DW1)|honH~UDa87^50occd1rtUGI(K>c_`2q1is^Pd z8sJ$XDwlTue9*5(cy`#yQ;)$8r{O{G(mh>9kfggRX*QX3U0RGN#W}!6-v419cur;5 zlRXA(6BpyqFe<{#_3HW#xuc-yli6ppxK76-?5h5vrc)0z7jNE&SjG#bWjriBq#Y=@)nfC}gLCe~IERaoS4 zpAAvckgR^6_{&dUCi9$m;t3?I4Hc3C3@wj4(j#irq+4QpGqbo)t$*_W!5e=uyq*y3 zxinPlExi4aZoSk&%Q$G2UerfrKy9U`>lf>1E4|ke&wsw-Fl~P7Z(VsLGO~ia!@u&S zT%NB_sUDB%B5Yin zK7K;{6t4QtA#<9adUV`JfMfO~npw>3Ro@Uu6v05fqwB)7s?-0$6b_c{|6b%@)(fzR_v!qhrwqqsv_49yUE z9NP=OVXJ|VMPcA+umr#WRdj@ffoDA0h(Ge0IGF}|g{8K5q$i}|sHnzwEO)C~Kb$+C z>rJ>ruw>i!;nPnCqy8-3HbhGtrC<74>QJ!d*~whoJM$+E*9q=jpzsv&K5|v)woJ}G zh8Wq7QOQv!W`)yxNt{hOh7Ll+{dp0a@aVhkGRyt=9cqMAFKZV!|bw|Ub%*Lj%e@kdb7@ElUBeR~ZX> z!znZJc)zbe=&EVPvSBs)5g%|GU|og_8-n8b5?F5@qpUVqQOmBR?||H*4nqtvC0}%q zyx-f7bFVn-uJ*4a;CbCCu%)Bcb0_Ya=qef*G4N#6_ML)F!DZw__HZz zqvopk>9kuN*D((Mjcxu)xI%o0y;7kz+T+^sk~AEEJD#U z)ehyWTE3GOLRzX8W~yKKriHA_=9>*9L(KZr;Dthp^x z`n6Uvac?=#>C5jAl8b^`N)ABe*W=3O)rg_&v^oCly(Nbh@)<-;C7U@s0D(6{RHxP^N=lvc@~Tsn#NSbbJhliS&tOPa;1~_uZPVo&nC-KxUxNfsP*mxOTWd4A z2@mq-e%bD%bz40a|L^2iG6J{>x}#nD%5^>X%3ca~R+-HOANKfrZ6wXqXybce!b2Ke zGng39!0%VEBJ19!5B_>Tga-9#`PYpbUtCsb8+j#}A8};~$#6;4w5BE{la&xD?mkSz zs@7QsT+H&MS8Y$o7ehaXP*ma6g5OkSvz*N zRj$%)$C>YgbI!5>;VJXXmEkVHjx zy`Oa3pOm$!RhwIK7X>FQG{w$Rh{(6%wKf50l+hqMrLk7IleU zcLTySfz4s}=mLm@X@A{0?uk=B>I$%aXi7trX9wh$q`?G9mEXU>4yG()Wb$vW&r_Kc zTmYUyguip+q!_>ONLcz}z2$B(nR3JJa2Y^va7zUuf%wT#GEVmy0ACL{>ZrkzgNF@a zQt^`SHy}}Rx})EK48~Ka?PfJgp5WJvTXaHn%3EuOWl6?OrQnBwvZDcdxi(U$Z0-lk z2;-FsI|R?5Hmy%jN-T^pwh@72r6GK%_Lg4kQB{v`R*Yr~`>M=)DR>G}#(rPtRPtE+ zFEe4i(Tp4E=_IGZoisoc(FYp=t!gwL0Ld|jMtz+ot#7joc~BD^*{z`Zu1BpW8DD*a zTQQ>da%3Xv7#AvM{=JqD@PF|u+1sQep~{PWW@V`z$Cdm}x3=QP-*bq97{>M)AUky@ww!iT1fNylH}1& zX1|PA;WsUhFYS$9 zR(|*GRJGZEbMsdmt^lKku`c_5l5;Xe^7gyEhZT|*qd5em?+64qnH%~t+E~D3 zzzSeG$!P-6jQb=fF57{p$36dttGAA-YWv=Y1wlZh1tg>!q>(P^?oLVR?nb)1OH#VK zySuv^4g%8k?xXj9?)UwTaU6p`j(eZA){JL9bFMj4SB2&R_VNa=j9Ba~-~ep`YWCt( z<_6)(KDewwk@mu9&;|lT1GOX{KzhkA4XpmoBLT0s6o^!6AbTtUtIFX+R~I+bT5g^o zgH-l)f}C8f3^1xks>pZ-O=Ib4D6k29O5rNnELxPc%X2(Tm45jEg=Tvf=ALY$X(c8~ zKmeD(az}t14kp4>i&xMfztUzgU2y3(>3({!&-`Q(X&;%4$GkogFgrdLg1*;V;0)}D zC||$hC;Hb*4!RFx+4p7f_q|=3)rf;wM&bDR3zkrQ8c@g;zysZp0W)I&$+2-2&005f zOzjwqg-X;Ea(Sn4KfHqVnuOaQ@Jq@lny@~!sJ~K@Ywd^D$=8?2pqr^rm28>NcDEE@ z1{Py4NLbi^gqBIx0Tw?Pcxtq&Ssa!REE)yV(_p5$BE@Bbc_Q}ZXd!J(KJ^bBw?2Zw z)9CkKodj$Etil4(u7)6|!G+HnN(|P~K;wLuoh|^fKNdduv3RSa8Sp|@5&||6=W0ZY zXyOwjOD&I!%^hMh!B;iIr+1tRquJkBlY9=ABGZ7Nf0FK3XX3+YJ4B`xZ7u6x7oSFs znK7kf%Xmjbbk7U1LJ0W@0CF|v-FU#+WO>j3ZdSjYv~>A(1-Yo9$?JWUw5eu$$^PB2 zhYy4Qn1H%~5P1^P>@&u)x54bao*TYchBLd_KcRj4C{Z4YR^xj-pa1TNWV!g<@X%E; zePw^@4nz{I4@Hsw5Iy|}XAabHCZVdT$Wlcn(`wvX`IAK^tC=MvQ=U~FzRvZcQy14i z>h2irYXRKxh!@l=J_0t#OiwMEo3{#KzrTJd*m7uF9RbWQ zz<3U`lkX>6ag6@72S*6jAAGu6<1hS@4b3)1+yt8)OjEeXRA^aWA|~Q5>8($`5WEH8 zbaobMBQ#W#fG(h8F3$WuEnoY5li+MmYSJ)ej;$Wtn1qa-W?<(9396ufug4W&TE)&Q zpVUZlZyiqpwca zJ?6wbc8k=$3u*}bNs<{uT_?^BRG*nACa$ki#?M|=pN3;Cb-y7Y4>KrHGd5?(^sxpP z-PU9O-~tMn0fm}>gOBYOr!vcnoA$Xa5r}bgC(jAMtv(2nAoI{2z)b7)db)fyMsz;$ z<+KzZfe}BqWQ*^mSeG2)6!h*a z6OZABpC3S=jL?8r2WW-`<(Ma!7X<7T)>%Z;`OZ@~j-hlwCQ$(IiyA#E`~w9xykiRN z)Gk>iHZ!Q)I#FIT?c`U(3|ER61m?fega(Wn8$}j;ZX1AyK7!r()4kvlHs`$LgIiPb zGwWoD1i*Xx{C644Pf+(N;Pu6sO5MPHso}NjYuADWTGi=@L-d$qI~1@*BlY1Zm%%7o z(eE!}*NOQ(BpxFngF|39;#|Aa2IDMW^a(=2u3LqTlEDpjd

<&6R;{cA+YOSrE6YEM#3T;eZ%1o2$MK|qHKg!!BPNtO$^?H# zd0V{%o`+pAE=6%>h||_jTqd+RWUQFPxuL}qFo{eg!Pnnv!dG=N?V;ytE!L8(D$#D= z=q}v$?xefjC0Z#p?lU$xwy9KZB!|L=`-Xp1uX0xVdeR9)X}L8g&|qlP7$KUW+m)Fk zr5=1V_Hge{iYiuRF+EyD+<7WXI~4k_Y9IztUNdGN8#UrU5dowyi7!=XHW6^cBmQ_q zv8CKHA>4oW`ZvE3VFk{J=|OD&^@*rs8kj;BEa@1_rgAZr`$2Q7n>dqVW0L}8N}{PH z;Rg>0-6_#3(Iq;Gm4OH96-W3ITRZzWK6>At=1?aiyp8dxHC=>B;eRKn~WC$9} z=QCMZCElH#)okzlc8ugE`V+KoM;dg_QIvaH(uDy#*!7c<;w=ypFVq#t;L8(z@dA^`-y-?s#KJ%NJr~^t$UN|oyKJ3u-E&Ydbwd&V?E$n0Jyd*T zPS0osG!LOIuZBT5P9#fA_1<~Ult99h0j-sqs80=<4hDp2_{PK&r;zvfKc%}LfJ|6k z(;WHzOP*tUljHSYShT9m{~mnE!dXRq)a7mM5*Z9H`5-18&^PP}P9fUN3_7Mr)>ZXU z<__T9uo-|3{-PO#^N9ig{oTnIzsTf5X9?<~_Rdtm3|n%U(ND_<)Q~lN08S>Auk`Nb zDjdmaI5xB{m}xqztkQlFpw_R0f$M$P7U*M7|HX71WE+=vyMX5X$tc`B-xoUfCsR5* ze2S9$&cvBO3BX$5u$fVQrFdCkrc!!kI-8{eQdIL`#|Suglh-?Gv6o=y{s*J`)PWu6 zY6vk3aPbCR2V>Bq+&o%}liFM@AcbcHpkB@MGYw=7>s1h;fdKj^`b2FKn32K|S)sx~ zl=d$}^U-t`_u|Bev~iZxxLQ%g1RiJ4K)*82S^WSb;q6)q*zTe910zjgD(lT#Oz8 zvNrIzO(py|GGXWn8obKz*-;GFmfXrS#~uL^*+X!9eG!A+pp{O!o0I*7rBO|`FTMsNN3egX#T z%crp`z>iftPJ7t4V+CnfG<#a!6TitF9yR(DwLRjc`1c$RkQa2+iN{;3wX|KG3KW&+ z>zyO9QcTG4*uNS`+pmx~`S8I2Pvd~?H-WWR+(2WR1~9Z`G+q6S%+o@-aR`{UTux-8 z9kZt*`y<7I>E00#?q3%j0e%IMvb3c7#>v352|<)BwM^sj0pCGs451dNRLeyW#r5T* zhq5Qw_Q;1e=*4`na9qR+ww*nEy;~yY(Hq;L*wRT)_NN|s1?<@kr#UW8IQ^^IYvwSV zWY-lNyWW}df?<}JSi}13T>%1B;6OTKNbsT5kr$K{Ns&HLMEO(S1gWK|*q;|mNT1SS z%HZhg)LUbx{>@3Nf?4|V(gnl*=mTd|DVN4U$AnTfqkEmXkdUpR{W(ntNR&ihOjszD ztlSo5JXWTHmKyWG8P})$Sz_t2j5uQr{whf`*guK6SAc^b_msQJO>SznmWhWxTqGW( z4f{D=UqC|Y?Z-C*M4N&Zv$p!Hq*P%ijpQ@|Ecpa!HXZR+W2(eHQqw?vd^|mk{E)^7r>|CIk^>xe$+3?KWJP<=*SL=8 zR8E%#fqp-v(-SR^`LUGnhN`h_ZGrQI-h51up3{Lh9!v?p&iyqEE%=kUi2zz;EOknT zmLm`F?FB-uSf4)&{RFI^pE7PQB0j{EjQ$|N_(3osw_00yRNoKqW7)IN84>O?7gzQpx| z!o8#xG|1?r5=YCXYDgT(jUQ${CColSWKTv%M{2JPuY1}gTNl(c$G|P)kiRMG3VcoG z`bx&HW~#pFfYIm7bomgr?K->ykWfFZ)T{R^P<*U`3wm(-OFzuNl2_>K#B=>x!ccoW z*Vg!aTJM&8hqTcJ*xdsBdkBi zk_zRR;!u>9_Kl+QxLehXQC(<8vVX$y*;K z{YbXmRueD)sJ~53`=P(>WVRt|gS88#!k!68`ij|$EHn8?ii%=W55qbF&2E-~G>9c# z{o*@NvBEiGLTvx<6Un-?|JtukgaM+-L}4EC$p^^A+MZEstU%|u8j~+F5LAz-Mmc|c z|F;t1Pvrw_6Y%8;u|axysJhd#xCbdrn)FC51*4+=F<*zZIM0|JhS=)A39Ua_qb5nf z8V!FNWYdJUcZ?Rnct2of)FhDZ#m&y3O`Ei|P6NxrHzh^?f8KE53X#zSZUpHU%;#d5 z4sdv~d!H6*XKMkPZ2Ev z7};JcB~E=*u$9hOSAZ47Bl_n0E7h9nv$^#dpkM$ZAeis~J1yh!_-4Q+DD&ww*hX^w zzQIxQxqw4K4bBUnDQuI6v_B4GxSpd?$p-$HT19b5B z>)?OOj79~LjU`}tz|=mGMA$=XFFx0<{OSbg0fq9(L^$Y(YQrl-~~Dq-1(* zmD8fN*Lwz(H29GOON>P|{La`bNbKn)7kq5Bef?)KKhQuU&G)N5p0 z#X9)8ylw${PFG(Kmv@i^$i={ zZph94@N#o~)0xX;Q%AOzhT&SA-Kmd)8xl|{mrj!(u~A5!U&Lu^S!a1HUif_QwNUNK z@6fikVE8R)xmCI7YJb%$1*FkRde|^b>e9ush2`v?s1+Ob$6pbN5D+sAemcpo(gXU4 zERj_dK1QiEkyl!f+bE8J3#=rSMEb(#+@C`fX&=L#>s!|AAjyrzzntZe@EBKMA;nPI zQ110V&h3=bqI<>PF|>O;)CW0@yP{k+<>f-iTurqvX8LuKiye);B;@9dTOL~1{U_`8 zUjXezb56tN@=0MC7u!v3$2hxY`DBcpNs+-%4zyrAjA46xFLuD$w5rc#9~SI1k15}5 z6Fie#rtJWYpL9-ID^*tLBfIFaFZ$(0pXBOyrq~n%CJTE2!e4PWNV2-?H@Gr=b^hG; z5n(M7G^yYU1zb9?xDVdfAp~!>4ah1 zSRJbx>*$M3YX#Wn93KTgceyx~#$W8WQ92mCa;+YO!sqZLzVkC9vFX9euO)6>>|Sb; z0~+1QY{@YRjXlPje4?+2z5@P@hS|b~S;i9q&*Z z^SqJ{dQQ-OCq8U$dzuh|(0e_3i62*+C-kG?{d^EAAo&!91ES3cUQ&6AZRga5t`9P! zb)w%?isMYyV{^C5zMB&Q7+LOUSj=V@c|6(yi5Vlh~21QRm1REM5kP0VTrB zPVv_naSCmp24mYzAY(-GE=t!^)S5;bP|1^NHI+g=jn$>KRzeTTReEsZq&q#ch|fc~_{ngrUrUNUKgY~g{%PNS zm*K&zxQWs2BH{~p-6b>DZFxtLc<~p;R%nInGpx$PIEgW&g~n@Nzk4^_-deUor+2a5 z^&FF!bj`}QK4!|_Eu9)oJp54OW%j0ezJwBMzs)oXC@pTPEztxw%;n2+gSJ=xslm&^ z{K?%e@9wfGe$>LT-a}1(#uN|K2|?$mqGEs0;!Wcm%vTRUMtf?n6U`N?`yu6)U#lG_Yf$D4vTARFOMLQ+oh4Ck&`3vZ|Lk+ZLjqK)OxmdrUhJ}y?Gxl>R{X|rhh|x z)}Ya|oS!=L-XbA{)G9xl8=Td`6HZ^hW#;%hX zHgv^kDo@)c#i!fGopkGFXD+;bR3uSvsQ-Pi$@zqGZG=lEB_Wj^@_1@qB&jgC(I?R2 z{2vwY?TO^oc7>`g=c4rp6i zb|>>ZC?$r0$Ms!8xK`9FxWAuVI0z~tld6eQ7Ae8JrK^cx`P!3JZ$g9LczK=}06L6d2({eF!ew3gr3r%}zC@j5m6`YI{32rZ>u>Q(2s zvZr7CT?N4=?7MH%+P1UqiKy&8&v&Op`YpZk{PC*!lauemP2{tw#f4(dbjq|&c94{X)dR|a5xF$QgIPL zpc44Z5d8xAnG~`Rjs-xeC%;0ER@U}bY~^SUq+Niw7s9@uc_mmq+L%OMQkm4UWltE4DUfSf{IuQ-9U!UW7oDo?Xbj4 zJk?IeeoWuyl@OKJ5%<>MF@@pT^Xeh0-SvC>_(!xe>mldA501iy(w?Vp=}j?@0`>}V zktcb|qkaIV!blw@izr5Uc$G0$C}?ftK-GvmSB|tN)4z_L_$vG^FRs-tog@B?epS)) zsfxf!jO)Uaud+(K4*Dca7nJNF%ur)xhY@Wd2Al{11l*%zC(YfDTzUwRga!fZwYE^2 zBOY!Wn1Se8DxW#2g^41C{n2gyS4fX!GC{?5w|*VC#d$rk3c453w`ay;hbO5|1q?i0 zEA%4u-Vmy?|C3bUk1uFhM5rn75;+9AN^vP+hadz0pa?_UX$>|pLdIN){PAR=-u*~1 zsZG~?t^}AqNr~Cvl`|cqutv90AJPJ?T37Bu=qMhHy z;OT)PDA2n5C^sPf&&poG(wky7BnTRA*Q|gdtON>0jMS6LFI*iY^~A3Iz3U zn^89g>g4RH7_%<4T20|Yq9S#14YNMS9E|p2w`iOSjkI2*syN&j7Er#zq4$mXLI^0q zzn`C^9UoDi$(U354x4=%`E4Vcv^R1l%?oKJCmJ*ao@dN8NPEXK=vX*CO@Doc%}Hg~ zjZx@ds?{Fi^_pRi?1$LPaLeVbhXtXGP~hDdX8up+Nung7eg=_Do04v*Qn$HC70rKg z6y7^!l(p^C-biEJCCJhDDg_0%1l#bnmrmXlh|I$#tLh52RAm8vveuWeXny1P+<{M0P%!K=%I%z=%cSD@<&UnNSf0d4f zbUFP}7H07~Qes#}ce(^iYNGhA3LX3YIomI1rg!j8>v>G&PMH@;|Gi`?<&}rvls=8(rs!3QOqz7dM@M-38OJg~&kdXh>P{H}`QHmz@|6dLOH?W4Iqqw%F`T>O2rMY; zJ-njlXvQ24;>PQ_5hvsvzT@RP%MMtmkC2wYV-Dz|a7LD7TS0X%O{xzpjeDWwk zpjiibsp#+Fm_E8X@au$$hekq=4$H3j%J`2GB|}wj3X-|E-k&=j?9cef%icXbjJa?j zc0fw5ppJ}qg!liSJ(mXdJa^i(-?~iMAzqQDWI3L%eT`-n;rxuP=a=$T)6faam#Q}( zL2(*Fskx7_FYNn25X0oXTZm{WQypTDX?Owyf~zW_M>-<@k5(K?1Lmvg<&7Zw%h1^x zYO!6%M+}7yXPFnv%2kT)ZL_OaYUvWN17R@cmzPDX(>^{E!ZVYR#>C=4Ytez_( znXW#3lF!HgbDC4>fTG#IAOzVyI|n&Q=-+XzIOyA?)$R)p9xyE(78xxMdAk#iLC^b; zbIQ2G=6aofJeAf z*1wH(mRj6QBorxWX9<}{WV}9|28aavwkLHS{ooWXX;g@ij704o_u#<?&CtdQtuPGJMJ#$Ro^?G<1_17@N4Ypp7-EXHV4uwbiN`Wg7gA5p368L!0 z?vlkuX=KRxgpsy~P;&Bhp71;4*{1T`gU;<-;n9?fh;}J=eNPimbnQ(rnTp8hp5b20 zeSwgCNJTA$ujm@ih_hyxZ&n!0BF`cAE4d0a?|c+X z?>p8F9U2LkT-VO)Qy6b`;@TW)Rhv!YV~fzMnN|AtQ;PND+NCDsg!?^xt=rJyGfP^1 zHA(Q-h#Ld7&=r{+3v?B)%i4LnEBv#=?#_mY|GXFIk$3BS>^kTIicob*jeAm>n<3e4 zU_Y26?)Vrzr=MBlRHlAo*s;LWgn+;nxhu9f;x%(zc9QcVDm96r02&;b)clwTH52?z zMGy_QDNj4>OV zUCFOV(gLX!_m4$$MdKnrW$R6|l|Ij(O>g2nm_?`6jU`dFyYd&Y(m9O@d^EVm#@o=f zvW<4Xm;G79K*{t>Ff^3#D!`GD7wlNQp|Xj74c0Fk43Ay>T&jxBeD$ccWMml1OB42j z9VtqH2lXul9jS`A+&@w68(|83uC zCuCb3o(Yx1Q><2L?h00{RFLk1HA&(n)*Z_TF~uS{y4+f@q}6DU7@OY39o521ChEc_ zoHwb^^pCcIeKNr$ocpg`<-6tX^+7rPreTv?aW0%EduJk8*a^?5c+r1Oi}^dBVJ#`0SA+Igo2Spp z)0Q|W%1@U)E30*d+cu_z7o>7=?N@lwPxw&GIHlschXF-F_-%=uTm|uHO2V^wzl~9U z#ir`~R%aLu29NZic*tRu_v@WYFT~v!?hL@mNO_oXDTe4@sgS$+~=??9`XxJh>@#;4j zQu*DIo1Mk>EW3Cw@Ziv=7inH+7$BtKW;$8)UlFBv$ScE8FW5t&nq@-h|rY>>`zU1PLS z7)PN@@`|a^wEXpMR9Wk8E|N}kDL*Gg_|@n!$twVx-nvD}LYX>Rl&sEHi0qC|r6YPx zb(MJPlh}<9%GW+}D|AzRd4lP2`X#i-g^74T%NtqM==9+Q#qSP*oIS@&IW<)9!B_E< zn+kFzb@ff#W=cgG)KttXyaNi7s1m3mQ<_C3c~Zk&&+2v6k-Wrvm9+YY3RQb_2YkEF zrSUhc53dK`|HPUd-i}BNK6?2&%w(1@L>g)Y9~b&9x28!vK1t|eW2k&5<*WW~75_u< z{5At8*(D;k7GmmUO9|y7y41XRY#$g|oNtLRImif~)|ITzQAM8Oe?&{DAF@hJ;Xa}n zgtZMCPq&RfDN+!mkC0#GAH=$(J~uFuFj}9C0YD=`B_UKW;xMn5q&v)WS6bkGf9$S; z;jSK~$M*QxZq*{ISm*D8v`bZ7sOq;ycc4<3-mT9k-=VgIv$DnUH-3ipgwt_GWOSU4 zmqsPSe-1q1%ZxYNYSY>&p=`~QnQw`5NKsfIFAsO2x01#mHF*%Q`SEDBNK^oS;@1!# zWvfI$JF^-VsO+&lV=~4ce0>wxdp4YUtTH&QACW+7+Qw2L1(VGFH3j$g+H@7WZ+gPs zN~VQED1cFB)W;jf`(hQ4t&xgp979B<4iT^J8s^vA`-_c~e8zSfl2~+o4X!ywi@m*SfoS5A`SPQj~t`#`UUI0Fd1&SSs2R-;Qs1n9?X1EkEO86+M)9@NY|WXe=GjZ@O%rQ6IM znO4pQ)0zFw5??jpRR)~DIF}7dT^&NL&a7E7^`^+~C4p-}NsX{tk+1@qOs`G`*6|CG z+!tYo6SCOm>-g3shnTXa=1nD$3X7w&^VKp7Mir^HtR6o*VI8>|0mSsDmJ!b1%!m2W zjn`*00+!f3+O%5C{dlOnVp;rvu3`6dhjv17-K7h)+?y#RO5_?nAayEbbJP#9Xxu+I zy{Wk}=_$63;ogBAJZR12<=?1_2f#e#AQsCi^Z8+!=(&CY=cvT&Oc9|F6godNU* zR+5r;^D=WzUQu8_zx$;QLD^S_ejT28InUG9!WqwQ*p@-w!0Bt}v2DCcdb zl<%jS;jP9rx$%0zJ`SZ|qwTR82w>!MgBhe3>IwT-1I?R3De|)?n)_+OcDhPRqK79M zkSU*QaP(A0mL8zacO0r@@{FdPo29wB9dKuL;4V+U#Eduo zgkhz7(rlw%F$%dpoluH6ZVa@;in#cI=?~=#CyN3{)^#ZiXYhN0GfVoa&+7G9s;m6- zVz(apeSGrBYQKc?OCPbQQfbo1iqNgoh4n#JUxp8v(Y|G4)>MgYpOkoK@59;r`C*b* zZ(>S*h;ZgDzsV{#IfNAgbY zyyE9h(o8RD`}ELu*}%}6Qm!`ZML`*tDIU6WX@Rqwfvz)PfH3G*K}DfslJ6ke769ER z{q|AZ7n&3Qx(v2Vi^rL_Ks@=rST`}?3uGr?^r6r;U2>opA8ub7vTS#6&RCboG@&J` zn^T|y%HBqw1Y|V@+wNKxB+st;k^lg&_D<;JV#9557bK%2n@h`9p>Z!#!;U&ak#jS! zXWw7-?CW%#26rXR`W3V**i(x?k$C+z^m>QxeokJT`jl5AfQ z&dqPg8nNGg8P}{8Ds^yBVnL+&btcyvO)I5ElgHY9Cf*=h*E|BV<5CCLUEpHPp~_kI+VUv)w}Fa!SVQT3UtWz{D+m`Q-G6n zG?ekWD?leq)hV8=G;jR2c|t}>=*XF*lKwQ9Dql*b8YRI}?b=*|`%raxHzf0%Xdl~j zZ8J1H3kfNG`X1F9P4`xt6#-8~lE7?SOunsgY)zqiwd;k*Ei;zLGBPB7y@hHP=Mm{* ztxSN#>uu>8Ch1YwbIrYL+M-p^IVQW96PGVj9o(U+E z-#F*DOG^b;JW{G_Ph)X!9YR=rD_Q_1=OUt|Ok1n@)%F1Akt?OEa|*`YnW2soPw`NC zw>6CJHbzCxKNR~L9}i~K*+&5xtI9#HY?Pm4ljcWt3*yKl1<_SAhAM`HmJ0j?PQk=l)<49>@|T-JMG{Rds&u#O#DJH-}*QcO6lD%ut`> zpabGWm}!DeN$^(o=|__+hc#6&9GgoDGY9G{hbtV@PrJRxm4s>$k10-+_6Z`liIfs3 z0J#Tf$v^Vbk)tuWNGy|RyQ)T?y{Co_pCOyKu@!U=yM}OHnC;Dj6U(@RQ#kA%(Zmju zhKXFos`(HG5|~{%Qe}a0>s722ua~&%e_>gi>8|Bx?>cD`I8~-iEtG4sH2*2q!9s5n zi8(@)Y|KZ_^_LYDRfS9)mVj=4|B2L6D2uQAa47+blbZSq;tvVw426h^meF{vl!s!` zGo`5bPg+_Y%@3=GLs(P7{i1|E)==197x42jyCyOO#xskaLV_k8KREZZ;Bh=A%I-JO z3e`6wYj#bhwa`QCaCX%cYSippxi-r8M`v>VRc^;|*uSW1YoPGYPO)>W*|g7|_w7fL ze0lZ_*60ZPOUFfVK()~=q3BZ0#xPwrjU<~fzmlXFw4N<|t3a;U956&xsvhWY^R#+p zR^BAxED8AoZi1Pb88bnc@70|kqa)`;VK99?Iy|1!Sog=7Wd!z}swk9l-{r(suL4)k zM2_A?;_;}kh-UWv@Q(&p_|(Zy{p_

1MA-Thgd2*WC>XJ31_edAMQ;n0Q;I%ac>G;HRWR}dw@1)TooKm`{OWMkkn zdlp{T5s}zeHvR?;!Qraj*y2rx{^ungga?y&^tX>3k6Y0zSv}vM%{C+5kC4w2rqo#B zx?ua&X%MVF;Oem@DV3ZJKL5=nOohI30!Lj~Rtlsh3NB(b z^?J?B1VH4AfWf||Fp_?e=&cdg<`O@1QZ(9j)aEU@Gmr}sb!@vuv|MRiEux97x;e8> z*(7kf$b=jt=Jrv@1XKP+iKAcGHWuLa5Z_qB8SS+7>Hqs%5;}-R5%h*TwOkhi$M$i< z<7z8ur{+iy>N&|M>H`%Re7{?^aj|>dv`R^le0Jv%WZU4k;1I~1p@lmR>*B}N!Y`y+KjP9P(8FTJzpqr;TCyoCcqdV3GuZ3fJT4 zt-sl{^FX7GjY*`f3^ka45(yD;`i32UG_i?t>WCg{48?KcRt;rN@egJ}MuI%EyyX{X z;T0*Pf}Os97q?EEMw*9RJNfCR?Dh-olAYg)_Jnqn_jw_M$S~!lPV7aR4oLsiE527^ zg8Yha+&NZHZQL(^o!jcAn_$L}YhPZ8bSjP9{r2>%J~U>zBlL&DCIVQqfP-J^Jy48I z2y=lC!>^ApdF?V3t+Wh>vg}1C1h{NnRE2PGo}x{?dcwnaa!AcKen8v=?*Y8KP7rx{ zPP>VaT+TMV{wxDb5H*e7)m*$Udo#3T2Y}}OF5{fQy9JN#<#+30Q~2IBo0U^Ley&Hm zI7?2-=QAbBLJ10I^K$N;C$WOJBR{dxlJrN}4pbZ6e^Dr)Luh+G4{8uP2_PO$X$adN zm>zljAk(jV5!b)jxcW^Bh_J^z&mPk__epuoWX_!9`}A(E!h>jqo+;iK)Ev!^fZpp! z_MHv}kMQPIrn+!mGbxo6*`^;CLXfHHLXiDWd&qsfKI!b(zw~$J2&8CxRO(l!-JRpe zYu9Tqs^{oA`O84mju$rB|t8tlL_l}}44l~?l z^@O$+pdh{kGm>)hd3WQ8J0v(}K_EjTVDDTy2&Eek$9uXi|F~mcV9~4RK|psv1Z~W9 z5=YwQBbO%ak+mp5nQ@NOiMtxZd&)C-z%iiJ^FLF8<0FAFnjjP?l_;r1ON-AezNXo( zj?6%<%ClO>AJB4F@yPEaO^d}gWy2%VTBpX|ISV~miKq5ds`+&F7`3PRZGx`7bcMw> zX1Y#Xhs|;5dT_4^mwXHwFNzNtU@M^^Hcc+!cEUI$Y!RQe_(TSZP z^eLsVl1^ZKw1av5uT7|V?_=d?8K2r#93HW&^wL`}OXz{*AdN)oACGQ3t8$q;Ui=b& z$?GPP@w~}-CoWZwyys-67EJSLCEt^rdZ$XrF89R@X@IUq`X{W~L38PSUJEnG*(C8) zMK7S{l*EoKooLkq1=Z1rzCcn9c7Z+Rg;A6=xiBfr<+p{-jI>IE&rZ2(Z)B&v^dTSkQA-QqH)vt^e2lGi z^xNBqpi6PH^x^3BQ<(RKAWx?%!=CqnDu?a}f?ba$!e_m&T0b&+ zS0s~K<%~u6dUoe~I3=lDQTM|cbJHB;DumDL``fZwLf2EZT_c0HY1`io9c+FqV%@b_ z8o&AK|D)&KEQ73Q2ieA?&e+nrbhBS339<;}ZYD2n@A%8oAd}wu5D-8$ifGZX>(hyT z5OFNdSAXII#ZIx77ZrF1?E!@m+QR)+Dp7xO^-)|5)lMiP#H3bc^7=qs2$>-R!h?q*Zmava5e&z>nY?Qxf z!B<5q^`d5Ya*3<^@*}C`Wy7o;>E~F3Gp7U)V~w;dt3>sfGL5sQ_Bajv|dk0D|b1%RN?4I&EuYBmY0Pd)_^omo|zzT0WEJzBu- z6E}5R6g8$70cq3pdK917L9&LfWYxxLrB=M3MUkKR1XN(S7@Y--p}|elPH@m1G*hW8 z95UyD#~RNL30B?^5|sF=Tv6D_a#dO7@=UX|P%d6fE)9@Bj~h;K{Vpt6H04wtd*l$> zEh8NtGt!3bX+16$Q`_&X^fn-*UTgfLilHWr&rk?E$w|CTXn z*RUgf7YfkQ*x9TYe^Y}b#NY+c8#cN05Dv0QF&P<1wA&0CUu2%O$5jcxkNHLp=Y{Hb zuqu_K&z~^w{|g~+fB{`2DP(Iz^ukVNn;!}8!A_*_OeEJ)LBiS&ABe?us>{o7#%cJr=?FFnu zt;81VV2%zMp!96?2nm%2I$7=F{uXUl7Xjv-&-lOuD?W9H?6Wsu-vbVSL7kHx*ai+R(%q@nvnW~apfx*O4Q<}Yov5?VvQ%E zw>>$VUfg%-EOL6nL!;?v|E!e*fELW@Y6==B(`}(6Q`W5?kH5SomOKOM-YJU|*mP5_ z2IH90R*0r~J*Rib0R*su5*(+fHxF#=!g2THUttDxvL^}Hv=6TlrdLH*5%@t-*VuKK z7tsNSt=~3j_@AS_PMD;#O8BA*Jr*>MFpKCgh|#HtqGQBQTonaT-8|Sh{;l5d`2eoG z)6YV%5A+K@lTM|EE9#HR+XY@XCT87a<%M zI^w4Qa7Bbb(#gO4_g~Q!C13-U;vv%_81ud6Dxx6p%{RKPg}oY zEAg5or@h8*U%K(}VtDuIW<4>UT1C9xa&_mhAT!}R5)a$G^!7{@FsR4#b`u7R`CF7- zAm>?&0?_Z71&i0S<#CtJ%Vy~RR&z9?eja z>1)@SCm$jqZJfs(P8SRVBPovT+bvf)4kvR0?J_7}tlFRIG@Up7ZHFie1`t?RHr^c{ zm$!coTdFbHjywPND1beRNeAMz7!PRn=QnVQ%F08)w=9ov-A*bmfXP^cUH*xo z6c}uGCbBHL8!=#_6pea~D9_Vx1)st>2pC-1vo+BDLOL*V1!-s5sy!Z<0X94kO}v_T z{4wV_1f6>1QMW7L90YWEGLmGolx(}(!(WWZ$wH;T^{SK3<@7{Dh4e3l&eo0BwiEm?!Ts9| zB{m3cG{`HM+dZybekTQ)o-tCXpT+tkJ{s1qIx;z|ymV+H+Vv()o&}*0OKLcMESXKz z@uW;nPObt5iKV)EKHu#lM#|*~W6^>>bCLbeRQNQYdRKGgUBUjmWc7tk$`lomlb6@i zvK=H%m_K${TJp#`$quEh0>-DMgT~nRaTU&vip%Q|c^`kdTF|!smM<E=03k?Vim_wzjK{qlZ!-*vlOE;u}5?>)0;X3xxThSl}hcsEJ}xlsLKfOWVsBs6q? zXK3rt>%mQicn5k1g@|`r*dxqizSdS=hoJGO{doev1MGOsRzZl**-9YsvvCy1Y-#o0 z^AAuag)HmZDwO%UCtpkJe`u?V4b;7}Z`@2aFD_Kcf4#qNYrtPL&vmx%*F)?zuly-n z*F*IMy((F;>&fOsLjb?mMZ?nPSDwE^^^$g}(_OL`a<4iGz9FCA?JL|O-vT|KzKtJt z7nUI(<)za}Pr4m8sarFQh!d_bsA{Bg{K-Q9D_~sEqgEg zkUyVM3$6TS%v4>R_VwPkj@0Y={?+lGwgu;Pu0=7KRk81KZP439a|3wgI{POyW~YolVXu8-pt{7Ib5qL+Y&+40G%UnGMu9B8%szus)M>`s@}WOBffgi=vq%4u z2CGtlZ06k-A8}T}LStVkA5ZP!z+K@xEaBJ_*=hB*wAduVey>5gE8n|}K zR!$v(?p?3X7DC{N+HLiCNv!9p2MZ&io$=XE5Nfe^)^845oDa&~uk7-r?VUuKs`c)6 z)FJJs6uXB!_;2=D?TOjrD-aM6WVz#L_l#$b0gAjnYeRy9LH5vd-H3N$Kf#qo^I7$& z|0Uq!EO{rD+HBd?UJ|4~xWL0%`|c&X;^dQ~5zt{H=%5$uG8vmOQq|T=ueQ>h(|`Gu z6x6A-j;vf{=Do=qIOnucKe}>1280-w*b%pP29&6?#Cl$e75ah+^VZeXl^xJTD%r?G zkv-$UYqrLk@d40&qpKx6INFRotY9NPgmI}geVnp%+sz+G>~%Xz(BUkO z^}26pD52q?zMrZ3rB4anr+}7yS!+G>J(aCmAL!cjv76 zy-FDLmrXup;SBW+6hSo4%6qKz)~NrZu{%S(AEfAXo%LIoDZL964tf=Age6`f-?m<9 z>^}_NEvFLD+ZYb__dllzSUUz<3z)Uf?982co7*G=2u8zUFW92dkX!kzRVClRrRFET z()sX;LAP<*T|Skoe6eYzvc&p49BTbw3+OSDV*gf2$sl!?S%9mqV`d>i(Y~^*>%@M! z)dzh5A6`<@N~vUfsg zqb0Jegj#6ux&ENx8rm%lFRk&V9)85j%6_zF4L?|r_H%a6y&$2za#*%y_U<2I%J z3+wNc>*H{g)xO4Ci{4N^^SDl~Hu&odw$CvkkkZUUGBx;)d&wc|SoPCQWb8Lh4?$Us zdxoIr$BAs}QAmX7Lx)gQwug-;5s0`fqMld%dgAUpHF`)+=@wq7&ameZn3%%1rGM}# zBs1{KU7_OF7)Wwfx3C$mo1Y)%)^PP#x4&gS~;@Y426-QU2EASL;Iux5V$4< zIY@V_jaQ5!`KTiKuM1q2;Fsj2kI^!}e~c-a0W30O@vwCtyf!*PcprFVf*jIhoKE-d z-He(g&$-(byNgHxVLDwQ#KZ2Bz64Gj}a?;XZ;mRp2qn!dzqLwx^Kw$ zcY}5Sho|~d5wxz%C+O#je9;QtpEH~a-o!w72BLZ^$@L3+uf27YAcS&YgrwRI(<-sU zss(84_8baD@E+(>G}kpm?Ic3<@fWFm1Ss*3(F3G%mo=RyFT*ZT5A$85nx3}3NmBbd z4B4EkUldI#5&Ei2Neb|Y?TB<)iEwb*iQWj zAw)BLGt=GFp`;|@I8Z7a|C~(EBp>V_@i@x^LBm{-Dr#Ua0v2?EyL~NkWg(1mrF5}CS`V>xJscRd| z^4=bGWOEx0FyH&2J08?+CF{JnEHRaQw}tlyLPzo$9+W~D_z^93;6$dgd`>#(4jpre zHmKRGg-fQB*L!!wjz4>`yIiG^KZq-G}NRQD=TkL zf|CMuX{g&q)9@OFFc?=Eqyfnj7WpHFQigyMTB*ze)>7MRBVOJ3_VRc3)hp1Z^pRQH zEC0Fe+2$%L5Ze?E!&{1rdHYDgEAQ=5z}6k?V0VIAR`)Hrvaz<_YsS0wuS1W69$Yib zwr%@NBn^$pefiyCf3`}>2SRw^c?b+Pv{9v@pXXo9DYrJg8-e$$t8Y!R~TG{}v7z!URFO7ueFo7+nJsVSg|dQE?!k1@3z? zUc;kgk^bA|2AC!CEGQd_4GIj45f{?DVB0P=;cualhq4IpoiX5DJQkK+me;5%sACaG zMh!ENaKscEs0K%rsuWPOJMGh|<$Ou9OgilZhvLZCFmTV7HgRW^IFmtB9l0VK!T8KS zvr1%#Y`*NB5+}Fd{9P;W^9KB&Qy8ykz_?EK%#;0WNCbFz4KG5=g-3mdLDdW8yMDx6 z8fz$In-Rq8Og;jLcCl;}PAvs%{M}c8(lNaj)0-Y`JCFq$oQ4^CA9YR}RLo>Gdl1Z{ zlnU+H-C&qZv$qr5%1N6JGy$zx0}a<|e1M)2XA|-bE%#?-d9UJL1yPl;Wn>*Z4|LoM zA$t>Mqb7ndp5vRHgT9)-w4Tx7eTLP+erH=9?mfbrSp9C(>>tjyC>~OMZ!2NSkMC z6JOO+9NSJ1b(L3PwMF1B*Ic2Svo%^2vwn>tVUX&&tHeY7?LgKUc%wAsm z&#uW{8uK+Y-(5{=SKpg~fTpNzHJBv^l z)~J6Pdeh?^Pp2-QF{R_Ia~EMw5MvehdK%l61XgZyhfn4bi#q1R)NvQ zCnGJ=vEInZXbB?RBYU77>t`n?4;nO=&v0!roD18`9tOoPLJyL(@Z!3+iH*K@@o}E| zF`Kg($S_b9M-cM7wq$z|wvf}NP(ubqDH=<~<555<;%7MlnlAjhxw=WJJDAQ;HO92@ zBIDqQ%VRnuXi!Klfq@3OK6LH$3)QT=2SGvZCwnBL2H=stg|^VnJ%UN z1A^r>%u8**u`C|W$uh4y^OFXHGQQHnTp^$x9l8K;USI7=;QQ;(gMep?Z3XwXK3Oi1 za%DJMVQpH$2muk{O$^j563(OSP9wEN)G#Pw?ghSKpD7>b?P)eHB(Js~^kgj~wUomp zI-YJpBk!hAS`kd`nMlZ1s>VU%rhdwOi zltu0)(CgC48S8vnO>`WVLJ(dlcG0`pk7tC0F=7>ZW1xw=tj~dgeUQb-xhzr(P3b{g z!c}Bx=jPXds$AsY{`i|gCFJr@gEE0v^)rDgqC@;Q7SFL?d{BO02%m6Oj)ma{+dD7$ zAjIe9j41sw*97oPnc)sKK7TUi1To+X%6xM@F*hMqJ$9hp&Y@(xeDilL(gG&D5>lA@mf$Ekf^zzeZZxaA2EFvIMG zG$L`tHHwY0xbxGn6x@N=VJlsW<~!})WTt?egT+#Fn*wm;+%ga-SR?r1uhnMbY&;Cl zBfX4Gf3N_!9D&mvLguvzh)wAMEik&NKbJo>PnP_{TP7Ii=dy+6Uwmx?0LXUfvRgq$ z)XbpoD&{=#^<*Vnp1|IS;@bd-w23p$q^Gcban{NR|Y@Q@RAhYM$D($$0S1*^@EMd*t9J!(c(LwrP zci12$2u&yoXz1Y3nU1lEL0^QKM8XEQ+w8DCw%kujSZ(><-0k)ZaH@H?Qo$j5bCW?J z6KtVrbP-Z5T3JO(IGd~key^&~GzG54IVfGHY@@g~B>}FY_rvLYFp%o4(?ktvKh1$g z#E=o2zo3o8Sh`cJ>f!UxKo`#ehIWGYwD4Ku?G7O3x+TY>p_qR=yMKwx18}inPYmBb zzQ)cdZyx8MGzyM47rlk2fJM9@b-q*jg-Yi@g<6^fAvkhX_K7 zP{?+VgoA?n8Uni_36e64wj>O;_oL(z zwK_WM9*WL~C-t)|7g;ytgjvx=!{&%Hee(+A8BvzsZ^f{v6PFREP@Yr^E|{K0W+9%v z7qu`e!A6ujeg<)IpKuz$a*7u6Y0C_4Q#R z*B3xtUBS05pNOs{g5+IaE2$NCivbL1#vC%`G9?Uzs23V{lCsZv3;2QKhT)-NChDeU zb?u;Q<_ohN`dC)zH8ro;s0Kz!2lMBcIO|;S*l{9J-(ECe|BliBgd`1nY*DBe*gAla zXWRS9BocB{mC2;NRJm3(Py=WEC`c^|1Lms7qKmXPgWY@*gv0LQ*+b}@)XW6Cp4pZ< z|ARD6EXa)ke=iCrMXq&jk7)W|U~zz3UX$VL!8jC-W{9T64{CjEgmivrg%$kr_A?K; zLDs$sDo}Di5ZcJ6^?iGZf2PG`vF0U{;Zz6mvzVFoLkN_{BQznqc17Pn4+;qXTj1bV zst)79cRC`HN6^5?z##B&HJnD#rJogDl1e(=%qf`zN1UKP+N&?_>g)T(RnwPI!U6g5 z{GwUXhqB;HNO6hEE_TENH9FFp9kC554d)&Wc6{0|=*rl)d#!@2B541vu>WWA^Uz(^ z!Z~G~Y%8CeSOE#-vG}j^vxqj+LX`*vAuBezaP%rs2DkbdTj=qQCuuwU=-u(zjEhZQ z==uyp$H9d=nf$P2xP)!sQ`ffrw7q6$$-I)TZ9a;Yz(dET4Q8n6?Xln&J$QmX zQoy;HqHjr}sH}+motA5bT&9iz?^=URyPSKXKpX1)iRt=?2ueH=-^UjjgttT__^&}B zP^rH<_T&5;5}VQ$i=s9bu=m^vo#$<{(fVYg2}#dhvb z#W9iX5pCReuoAIbxYVu})I{r~(O385{-WSr3A^X%+I61DMT0T zGDNTr8lT4LZk!P&&qWSvu+u78KOeq9X&EsCZ2+x7i^9R)VxRLDLCRXK|t9RFR79FpI%9GvD!^1SmgAnsznE=A z4MHnso2ygeUG7El@$y-i#00!y--(7sXG@{;KQv~woQ}!Bypx4X<9RnR6Sp>A`$mfWYMX5YHi-PVMeo&w11QMXO5|uh5FO z84j07TO0QeW~a))Y~KQdxJ!(q0;jpkORL|+82_2HAQZfq{#ti9RF5qUG92ZelU>Aw zU{<9dT3eHN1c8|ol;MPP1a)@t(#RbexXK`u zX_ct6udcOf)d>3}Yr*(Zd$0h0B?JJfpsFUD$;L&{4Y|4Co^}@`x@jD6KodtR7gk2i zq>91p?-cr*?+-leE$96QKp`d9N?w&5ByOg#<7#sR{`BMDs8?Y8U%zzzC9frMG~Ny= zZSzF+$}l{PQdu@GQlkvTY_3TBeyAkf#>@v_HH- z=#jvnI<+t&fI_(E5pW$B;*gPY{|S?2Vu8&Zm|u-1d%*01`Bcs&pI!@O)q!Jt=?(x) z?%x5&C_za;kqR3c7*wDgjavq5R1Qj4=dQUthJ+0NtTRa9Rz8eb!wJV8taBsc2&4V-4q$JIn^AQui8=y_`=&5jzcU?D7L{6{I^bjjzAPq#-PizB;)4^ z-5t4PG2NjV(kfd4l5{0hTaVV#2m#csyv2We!2mfrXXW0%ie0PF#T{g7- zY^shlIndMtHzq%C7uIH`_8`yYQ96;;ribRQaE zT_50!Qp;T{Bgul9Rx3}X3d?vdg1bF(Sm^w zE}8pEy57UOvDd@kF=4_kp>jq8PJhhRLVCrG9{XjEPG3@li<+C`7Z2Yx7h( z)||iF|7ddNo#r^OD>!|AQa=R)fusQ-o@$cIHS`RAdTsZ4Kgr&h0f>ctFBrI|QAm>1fm6jw&sI%4P`^2g7Bfw0K5ha*sBK~IrQq#~u|5F> zI#@eEp*R`7w`fO<-W&nIs6k{j)@0&!&rwqg2&t2 z66NKo8c^00SlN~S=B^rSq-A=LygWJ3HZ7d{2RXGp6nPgDSh zytx1pp<79DWtzg-;J?QEU;)5DpQL|@1XxLxZ>1SYwziN9Ge*BKH2ItPASKy~Y^L!3 zj6%DS4W9)onoaBIO2`1L9I!W1AUppL4&RF zukLyWy0m*Wh|L?EFC#_~j1wtx0laGUecRu%BBxZXhn=Uo55~!S0GZx0M8y9`J>iiG z_7{so{I+XH?UhZ6wjlv*9v@=P_+9}bJ*tFyKN9iRjlz@G46G&A9!{SwE1DdqM9+7Y z#7nsxhvD4bvH#_But@VsAOoajuH*?nGx7LQ~aBWXLh5)WmDuZb?&D!xn~OJbuOogllLBS z=XEx>W}?fxs-Nt(7xdV<)<_$wqP=t)75p4sqW{h(=5uS!*XKa@2KHMI)8WH)c)pFq zp7R=oD=DZFd2fEQl4cMA0NDySvwnGlWU-|Gb35?N?C3S)Uo%0l0^`MOSxFe)_|XOF zW>V}%d@S{;^!c{kEv-1fAR!E9;uOJBXWY()X%zKELBw|TF|!AP2QaPPr)eobECs^W7lSHTc#D7TN$IC6? z0$X&UO783Dw34B1x6^^d@{U^k7`5laeUC%{q1xPp5V-1dZqL7>UVg10NfHg-)j1Q( z8rf7#nd&~;_Cxx=U3ir)+5-OW->5y%Gt*XV4S3_^1=Q;Rikpvl*O#m+9=@r1*Qmc1 zM-%yDH)Q`xG!jHe4R{BuLNi+=d0Nb{KJC>%iC>=ZH-b9hgCxIs&e^{{;t?~%JfF!TDVV(b#5E-`IH$ z`CzHkcOGNFZ}}g=j|Rv|bY?m=3kE1fL8qqMQVXwN05ZC=>Yj;(g~Clxpl`M$-}vko z)gs5$>hFypRV7+>%G^A;joCBha(4j2Mprtu7#quA86hD1I@K$gj$(gD=lzqLcSWyq3AoDUT7jhv=Je z`{tth*;Mx1mHO2kit_QOFm3u3P(-MKH#3-1Kw8VeTZET(hTOyO0*C<@QaPN&dWy(si0xrF{r@uiRx|5?S}N26*< z)p&d2rK7B|4eLZ{wXy?w+^3S8B%^R6#@wT7{%dA*fZCFy?7p_8R;)6JwW!^D&7S*q zfBt!%dfF=iJ@<~lq~j2*uepXBcmS|`LA0-k_ElkM%tq|MtF$omXg*WtK3o>TMm+AX zq=mO;eijW|O0=FA(D`@+4fTsQx$A^X?X+wEtQ!<~GVOFWh~;41AU5WV!~oozg6;9^ z(6aLz-+~8;n+&Y&t&fXnPa@BUHbOsNiBZHxMuWk zwk%Oj;6?WbCBJvPZ&{L_Tg&&i?0Ei{3r1oXW3 zaHg3`CFbsUCbdySoSRqB9P8RiIETgB7$e}CTAAUgJU!Ah!Q=F!`{e_z$@At4EvYR5 z9aA!MZkVV1Cm(Do!PpJ#XG3#UaNv`Y?`KZ4Fu`0Za&6}!EafIk2|v{)n5$KM<~J1+ z>vR%wWh}3qz{SwXT)AnzO=ABTmO6;(8jSF31ovem2BW|%cWj?m4Ij<6u7%Z2oI~O zUSwCv+*G}aMTzn4=#g1WitfgtaOfJzHCdvMC3BQqI=gl=G@EqPigIlFc{nt&5JA32 zwuOOKT|MuTvG*}+Qgbmjjgs%6MakU_$zkW8bf#4~i2JBr#_N}I32R8ncQpvWw@ZA} zI2|#jPZPCrewEZ6WX~F@3eFPnXwGKXhZvvjsXctekXasSUK_bK>w9gL9hTv_W04=$g+X;xuw{cDKEPiWyPldN$$J% z2Cc=c^-eMA5BGt_XWO`nM7yzR!_5GY!cQI<%^&W-cIm7rtP-hKwQHy9_~)riC*4cV z4L%2px|@AM#lXKs_$W|cLa}K^U`d_F{sL>(YlPgR%j$)jf<2dCb>6ri=c=O9AMWyv zFAgyjiOOOt$`XG(L&DMi{*{9cC)?rdb{GjN1GQ#P(Z1Bu`F0pn$YA@dGi^}5;MYM$ z&tGQO$H?rf0E$Qy%9E_&#lOj**h+K(6;)fP#};de7Ja?*`)Sj(a9I1+{R7p6a?DKC z_e=48axuww8k#1lkY72h<8MWf5nl)ojri=mWKsCwgqhr{t0-RKe2D*_S&V2yF=;M( zKE$5Y`}EmGHk8FXQ4=%ZS|aS|MCL&-F4##Nl3PZk(=%y_*SbsQzV0QrR=@9rhQ6id zyXH&dyoV54WQbMN@Ec4z90)ebuH&1F@^x@&B_>p$$tE-3teCM&rEK;=il= zIDZysl)vTB{#c@c6%YCI$HA1=>)UJDe2ZO%i%?aSwbT=D5E&Shs;pd$!wQv~!I1D_ z0m|w5v8zi3)E&$Gl-6o3An-%VhTxmt-N?`UZe@k6Idf?m+q~>Zt;puw;_CTFR&1hr z_Z<&W>%s2{%VpKyohUGDat5c|jH_4N=uCxB3rvOOYJ1RfF1c7Q*Pa$H6!u7|r3p}D zCalg7PkilwLN^Tqtc-5B-ya9yTdT(zG_T)LPE&VyH04HQnL1pZSc|cF!ROd?r<}1g z;Sg{u?N{<{zIGRXN(V%J4(5CqvGZsPFz3&OqWTpP%6S8R0^q5dXR^0sD_20{^3#A(gifc>imY`oBp6C-s2)qmAgt6UtMq0g%{ zo9d+!#Oscc@agMd5z7*5Q7<}igt{tJW4^!lno;Ep(kW|v*}Nh`@kNH(M~~H0Z;zd%(#}%#&)uIz(fak-4K4Gf z?(&lShr8kg#dJ&s8&r(hhWEzXfT{s?st>*K47YFT63U9U*l?<&b-$g$24@v{&XVM2 zyh;#uok&vK*yGbUrY4|)2@K~P6<$t?_(g&x15G&cb<#QpP-iAq2JcmeXUrA065^L0 zmI(m%c@&`8q^LiPaSiOWw1CE>#0t$L{&RtSc7TeF4~y7O%W5-rozp?t#VIvupKrjz z$_EN^16DL}%!lk)y+kd5`)D&fI#L%cIfJt#eZ|>NrYy{h_m)W{K4rj4=fi`>JJ4P7 zE>LWfF%fQYxtRN0Tk~PAXTXm5U?Ir~x)l5L~06f*HZMTJ|@BXL*(rmh&kI&kN8YGRiN zSxh$H(_QeW=2-)+;TR_FyBt$Wpux+x2fgMY^3?stJ}A4(!Th&cjVRzakWC0gw#k!; zHGzdeAp_e)P?E*yJWy>RK{X_d*+YY+5~A$nUqMTlw_xLd_VYuXMZ<+s;cfHez=yPNA+mR1`CsXD`Nm9(J$?>j#=PgE765RZ1Vw4&UV)+t3Xitcb1v@`pm;)Ag0q6ttDOAa+>2Wl3p(GbG!S=$F1w^}jT$NR4ZGBgJM4Ap0sc`k2P?7ILRQo_HCnN4dsQ^T;4X ze5T(Yem%;2NscgqT@o1dCJK-J>+D&3%4Sb`J~hzkg0|Jse`}DavLRq>-{iV~Z>*fd zE@8H^okAw|lWD;cLhK&uc}?!LoKkN0SQ?gOIF$gs`wrHLpAPa~(7IvG`tseNbkW%ijDqr5>Q_WnamwKBf40tO{ zwX$c%?Irff_vQK2GAT&acq($qRf;_X;#R1?t2>*0`GJlZ6NbD$K9wW=EmXPb%Qp_U zn*>YcPqGJap#}VmSYM~E1HVSsJ?W{D7m!93#rK~YbTi^VQuVXpnOa=A@&$SKD8tjO z(ZY+0Wqw%0*0dksmY+Ls;gXxp;8Sg^|2`TeC`1FC;99TndC0AVjK5abYbj;E)0$Qd zj(<~V&x4uSjFgq^uJX;Vo!LB9fpp;o|0dWnDyIVwe!H}qfgQz?~IcjJ&xXhoBL z5KS-b>9>wc7ZsU1zhE0x-bl^}GgG@dRy|upSV1w&?;lF!*y%x2D5s+fkNvn}UzXCV zDOaC3WiH$C`tCscyUNd;>f*n#8Eg<4hvxk%{)}D!T|}Q94OjSQ`Ypso5tf_D%|QgS z3T<60bix1@O{b+{K-Xa|Nz##7h44mz0g;k4w24na0 zv0CndkaHW9#O_6Cb!t-K$;QC}=UrCv0nPEpMTKhbwvc18nrS{KI}%D`$5BSokw3wi z;3V`ru%;x8E5gp1l+AjLXFMVcump819;woSFWw-iE8N43+m4j9|en|ch1x=~YvGdV`+u%dRQ&=e` zP;i{8A5SCqvdNWAQ$9U+Q}PQqR3mL;G0ElgAzW7Ve&K@ZmN*9KEhQc{XUEIww?pHE zp9T(eD870T_wCG-{2tQqd-7L?0p?1qMH|;VHn^`vSMuN9%w}V6vp`T7$(@H6vIjQ`ClM@KB7RKHj4kb`@byJ|L@i$>T~wV zY9)G7>+RLa1^`z>=4mf3rr!o2NTMIv7B(0pbyQ=YDm*4AinDoM2;;?COvaK%e}aCiTjyMLUcozZ|;3^sb$O9t(rB{3TX0BWy9*R|FcoOXO%({jf!zaieANUupI z5{S%xrdINn^6vV~yb|fse_|7-@N)H>Rjk!QJAJ$)S3OSN7R6h4Z% zYRgz4i%|^>07}&TXeP+_k3~>~W@`2o@~B}Y0N)tM1hQL?miS?ksFUzPk~;$g=4Kxp zYQg{x$DKFZb2Zkzh4;TBz2c(DB@kr4>H>HSIx6^K<7>$T{<8%o6;jk5w! zsb-}U5LTx^x=xbY`Od`4?3)VoCya-&05dg&UIYLSP2prG_Bf5k#KDpA^z>}?XujTg zd9|5hZ49JVu$YdJ;4&NfI~*?ZWy%{-|GEH@e&V`9aY7Ft<{GA=`t$f9mdyj^8F9t< zB@YH_mssm!QLILj+Gs=$oGI(Xe}BTHtkdi0%nU;@nir01KsgX)juxea|fupb2s(&Wl3C%5dcV~-7KO3!J(1}>Su$Dk!0f< zJ^ul(-o&L*{f(&neepjcOqif?E7AxjGYIaeQnH0YlIwl~&k#w76+SY{`T1z3+r zCn)e76}9wvHKCWh9y~q*`B!7G#O_gQT9#Fn`_*%K2I99yS&5QM*S9Cb_UCQqKz8W# z?a-`O%l$neFjB9chaTX-vf7PrEekN3lk**rPAu`Z(p2esJyzk^R3gk@Gc#2J7Hl>C{mV2zRs;4bNOfZ^16EH=7s_mW5MMa0J^fxLi(=Z(A$WFGp#G#<{9 z#^WDXcj|f`@#nz!QjfvFjXVH*RdHMJ8WKEs4Jyzx6Qs_jlk45G;TcE(KiUywzF-*2 zFvfQ=A4^;v&NZ?nH~(_YXQ2Z{fOpl@m_{2&uDwMP8S0PJ;Z6ZofW_p57B>|7}T zd7GaMt2hOqxhdys3%d+8^J5;HK$6$Ntm+@qwvJ)a97bn&oX@nDrhnWiTm(c%`l0He zWKYmZDZnBJMAb9zQqJT7IxPaZjdNP|gY5Qh7?P*JKFd8|Wqm(1un%MbYEMlX!<}+0 zx~$DF=I~vBp|ZNM*YoBq==FyYhi~9+8KK&zvqZRvZ>d3GGVyBPZe@6FDn(4`x|Q6_ z;#<{{rrCDmnvLa1>1Yu=oK5MS+-QD(=eTc4Ib`Xnc%pb3NbEVy!FWDPq-7M&Zbvuy z3&Rk8rP>{Ufttn2ahNTAq!jdqfP_*71@z$s#jU<9Yh=+|0ub40iS5=~vYyx5`P%>- zaX@BW!bvE{5(#fKNY=ksUc=xMmfgEn08~D4H)!hxKqbHb^tf0^l;=AeNBa!FAVml2 zCM7||g^f{3NN)uYJluv?i%Dx}4TU{6N1t$Xlg_7&B2$0P>b3ze_))c=&+siqCi$zD-2TKecXFI1&mpb2$m1rjA2Vj8D8PWI`PRs5h^pu7e4 zw@y=WB{|h7wt`(ZU3vdCngjv!B(2$QNe$6St>2?;F@vKwn-tXU2xV+eV%+eCMwT=$ zshTuQ#JZTMP3&H!k0u;pL=6@*n60B^UbzDhrMi1=08XKaAV_r5TUcKM(x>;E9e>R@ zXcb-|b}5;4?M_8*AH& zE$9O6a{QJpBD0Tds*IyCR_s%o$ziWwJP2<@zM>)ZbrAW*U0~ckkS(bd^6(5x6WY(X zGEzd2goTK5>kUqj&V&)}f<_GIIYKb;8iqU1K z0E6tY?5L3Tnw{7USOL3;yD;xRZ<^DG7<8+TJLI!jH%ABOMWRSpAJ#Ejq z$#PThbM?ewqiG7C+j)}A8S=+v&R;i`7&I^-vfO}c7IIV>=ta+)eOjO(J!bKA4%7LS z2JlIHzJ%@YtkoBM!AS65I+;!Yba7nbL%7r~Gn%#HXV&-fi{*R?{9)eYzTv=rWyv6N z3+kk3q!|pMa2<}h?G|_(j4w?054<3m&;g&MZ$ubBZ{n9cZy1)S*EIIT#>zw|1+@U3 zU*K@m23up@Fy%t>;$rqUh;<2vncrg_VQLg$<4~BybrDrC{os9!d zk!3D4z@?xc@;v)-7fZ7MEhLD~(_3qSHC)THTNR)jDVA9DP}Mxd3zfD=sssetRze`r zN1A-Iu5b3T`T_uKa;)fUX>!IjFOaUf4M5@tzFI5*sCHN5oV(j@&WaQu)eZ| zFiYo_yMHSSDJu6j=34@RR-V0YA~ihMF}m70j!h5uH{3`T9Y~x6ti(=IEpu0oG;M^6 zur{18U2E8$ug#SAq@T+ox_N3#A)c<-a1h|6mUH*??dwl<+z<4wo9;c@Y0+FdE zIX?2}pF0IOY}cW^mhgR dzrjThknwGN_@8HAEkFQ&q{QS!ONI4){}&fI0&D;P literal 0 HcmV?d00001 diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts new file mode 100644 index 000000000..e44f13a92 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts @@ -0,0 +1,204 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +// Imports +import * as defaults from "@aws-solutions-constructs/core"; +import * as lambda from "aws-cdk-lib/aws-lambda"; +import * as iam from "aws-cdk-lib/aws-iam"; +import * as kendra from "aws-cdk-lib/aws-kendra"; +import * as ec2 from "aws-cdk-lib/aws-ec2"; +import { Construct } from "constructs"; + +/** + * @summary The properties for the LambdaToKendra class. + */ +export interface LambdaToKendraProps { + /** + * + * + * @default - Optional user provided props to override the default props for the Kendra index. Is this required? + */ + readonly kendraIndexProps?: kendra.CfnIndexProps; + /** + * A list of data sources that will provide data to the Kendra index. ?At least 1 must be specified. We will do majority of + * processing for some data sources (S3 crawler initially), but for others the props must be complete (e.g. proper roleArn, etc.) + * + * @default - empty list (no data sources) + */ + readonly kendraDataSourcesProps: Array; + /** + * Optional - index permissions to grant to the Lambda function. One or more of the following + * may be specified: `Read`, `SubmitFeedback` and `Write`. Default is `["Read", "SubmitFeedback"]`. Read is + * all the operations IAM defines as Read and List. SubmitFeedback is only the SubmitFeedback action. Write is all the + * operations IAM defines as Write and Tag. This functionality may be overridden by providing a specific role arn in lambdaFunctionProps + * + * @default - ["Read", "SubmitFeedback"] + */ + readonly indexPermissions?: string[]; + /** + * Existing instance of a Kendra Index. Providing both this and kendraIndexProps will cause an error. + * + * @default - None + */ + readonly existingKendraIndexObj?: kendra.CfnIndex; + /** + * Existing instance of Lambda Function object, providing both this and `lambdaFunctionProps` will cause an error. + * + * @default - None + */ + readonly existingLambdaObj?: lambda.Function; + /** + * User provided props to override the default props for the Lambda function. + * + * @default - Default properties are used. + */ + readonly lambdaFunctionProps?: lambda.FunctionProps; + /** + * An existing VPC for the construct to use (construct will NOT create a new VPC in this case) + */ + readonly existingVpc?: ec2.IVpc; + /** + * Properties to override default properties if deployVpc is true + */ + readonly vpcProps?: ec2.VpcProps; + /** + * Whether to deploy a new VPC + * + * @default - false + */ + readonly deployVpc?: boolean; + /** + * Optional Name for the Lambda function environment variable set to the index id for the Kendra index. + * + * @default - KENDRA_INDEX_ID + */ + readonly indexIdEnvironmentVariableName?: string; +} + +/** + * @summary The LambdaToKendra class. + */ +export class LambdaToKendra extends Construct { + public readonly lambdaFunction: lambda.Function; + public readonly vpc?: ec2.IVpc; + public readonly kendraIndex: kendra.CfnIndex; + public readonly kendraDataSources: kendra.CfnDataSource[]; + + /** + * @summary Constructs a new instance of the LambdaToKendra class. + * @param {cdk.App} scope - represents the scope for all the resources. + * @param {string} id - this is a a scope-unique id. + * @param {LambdaToKendraProps} props - user provided props for the construct. + * @since 1.120.0 + * @access public + */ + constructor(scope: Construct, id: string, props: LambdaToKendraProps) { + super(scope, id); + defaults.CheckProps(props); + + if (props.kendraIndexProps && props.existingKendraIndexObj) { + throw new Error('You may not provide both kendraIndexProps and existingKendraIndexObj'); + } + + if (props.kendraIndexProps && props.kendraDataSourcesProps) { + throw new Error('You may not provide both kendraDataSourcesProps and existingKendraIndexObj'); + } + + if (props.deployVpc || props.existingVpc) { + this.vpc = defaults.buildVpc(scope, { + defaultVpcProps: defaults.DefaultIsolatedVpcProps(), + existingVpc: props.existingVpc, + userVpcProps: props.vpcProps, + constructVpcProps: { + enableDnsHostnames: true, + enableDnsSupport: true, + }, + }); + + defaults.AddAwsServiceEndpoint(scope, this.vpc, defaults.ServiceEndpointTypes.KENDRA); + } + + // Setup the Lambda function + this.lambdaFunction = defaults.buildLambdaFunction(this, { + existingLambdaObj: props.existingLambdaObj, + lambdaFunctionProps: props.lambdaFunctionProps, + vpc: this.vpc, + }); + + this.kendraIndex = defaults.buildKendraIndex(this, id, { + kendraIndexProps: props.kendraIndexProps, + existingIndexObj: props.existingKendraIndexObj + }); + + this.kendraDataSources = defaults.AddMultipleKendraDataSources(this, id, this.kendraIndex, props.kendraDataSourcesProps); + + // Update Lambda function IAM policy with correct privileges to Kendra index + const normalizedPermissions = props.indexPermissions ? defaults.normalizeKendraPermissions(props.indexPermissions) : undefined; + if (!normalizedPermissions || normalizedPermissions.includes("READ")) { + // Add policy with query permissions + this.lambdaFunction.addToRolePolicy( + new iam.PolicyStatement({ + actions: [ + "kendra:Query", + "kendra:Describe*", + "kendra:Get*", + "kendra:BatchGet*", + "kendra:List*", + "kendra:Retrieve"], + resources: [this.kendraIndex.attrArn] + }) + ); + } + + if (!normalizedPermissions || normalizedPermissions.includes("SUBMITFEEDBACK")) { + // Add policy with query permissions + this.lambdaFunction.addToRolePolicy( + new iam.PolicyStatement({ + actions: [ + "kendra:SubmitFeedback"], + resources: [this.kendraIndex.attrArn] + }) + ); + } + + if (normalizedPermissions?.includes("WRITE")) { + // Add policy with query permissions + this.lambdaFunction.addToRolePolicy( + new iam.PolicyStatement({ + actions: [ + "kendra:Associate*", + "kendra:BatchPut*", + "kendra:Clear", + "kendra:Create*", + "kendra:Delete*", + "kendra:Disassociate*", + "kendra:Put*", + "kendra:Update*", + "kendra:Start*", + "kendra:Submit*", + "kendra:Stop*", + "kendra:TagResource", + "kendra:UntagResource" + ], + resources: [this.kendraIndex.attrArn] + }) + ); + } + + // Configure environment variables + const indexIdEnvironmentVariableName = props.indexIdEnvironmentVariableName || 'KENDRA_INDEX_ID'; + this.lambdaFunction.addEnvironment(indexIdEnvironmentVariableName, this.kendraIndex.attrId); + + } + +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json new file mode 100644 index 000000000..ed75cea81 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json @@ -0,0 +1,96 @@ +{ + "name": "@aws-solutions-constructs/aws-lambda-kendra", + "version": "0.0.0", + "description": "CDK constructs for defining an interaction between an AWS Lambda function and an existing Amazon Kinesis Firehose Delivery Stream.", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "repository": { + "type": "git", + "url": "git+https://github.com/awslabs/aws-solutions-constructs.git", + "directory": "source/patterns/@aws-solutions-constructs/aws-lambda-kendra" + }, + "author": "Amazon Web Services (https://aws.amazon.com)", + "license": "Apache-2.0", + "scripts": { + "build": "tsc -b .", + "lint": "eslint -c ../eslintrc.yml --ext=.js,.ts . && tslint --project .", + "lint-fix": "eslint -c ../eslintrc.yml --ext=.js,.ts --fix .", + "test": "jest --coverage", + "clean": "tsc -b --clean", + "watch": "tsc -b -w", + "integ": "cdk-integ", + "integ-assert": "cdk-integ-assert-v2", + "jsii": "jsii", + "jsii-pacmak": "jsii-pacmak", + "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", + "integ-no-clean": "cdk-integ --no-clean", + "snapshot-update": "npm run jsii && npm test -- -u && npm run integ-assert" + }, + "jsii": { + "outdir": "dist", + "targets": { + "java": { + "package": "software.amazon.awsconstructs.services.lambdakendra", + "maven": { + "groupId": "software.amazon.awsconstructs", + "artifactId": "lambdakendra" + } + }, + "dotnet": { + "namespace": "Amazon.SolutionsConstructs.AWS.LambdaKendra", + "packageId": "Amazon.SolutionsConstructs.AWS.Lambdakendra", + "signAssembly": true, + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png" + }, + "python": { + "distName": "aws-solutions-constructs.aws-lambda-kendra", + "module": "aws_solutions_constructs.aws_lambda_kendra" + } + } + }, + "dependencies": { + "@aws-solutions-constructs/core": "0.0.0" + }, + "devDependencies": { + "@types/jest": "^27.4.0", + "@types/node": "^10.3.0", + "aws-cdk-lib": "2.82.0", + "@aws-solutions-constructs/core": "0.0.0", + "constructs": "^10.0.0" + }, + "jest": { + "moduleFileExtensions": [ + "js" + ], + "coverageReporters": [ + "text", + [ + "lcov", + { + "projectRoot": "../../../../" + } + ] + ] + }, + "peerDependencies": { + "@aws-solutions-constructs/core": "0.0.0", + "aws-cdk-lib": "^2.82.0", + "constructs": "^10.0.0" + }, + "keywords": [ + "aws", + "cdk", + "awscdk", + "AWS Solutions Constructs", + "Amazon Kendra", + "AWS Lambda" + ], + "bugs": { + "url": "https://github.com/awslabs/aws-solutions-constructs/issues" + }, + "homepage": "https://github.com/awslabs/aws-solutions-constructs#readme", + "directories": { + "lib": "lib", + "test": "test" + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json new file mode 100644 index 000000000..d423282c9 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json @@ -0,0 +1,779 @@ +{ + "Description": "Integration Test for aws-lambda-kendra", + "Resources": { + "scrapBucketB11863B7": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W51", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W35", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W41", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct" + } + ] + } + } + }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, + "minimalargumentsLambdaFunctionServiceRole73B77FF7": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "minimalargumentsLambdaFunctionServiceRoleDefaultPolicy59EC60ED": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": [ + "kendra:Query", + "kendra:Describe*", + "kendra:Get*", + "kendra:BatchGet*", + "kendra:List*", + "kendra:Retrieve" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Arn" + ] + } + }, + { + "Action": "kendra:SubmitFeedback", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "minimalargumentsLambdaFunctionServiceRoleDefaultPolicy59EC60ED", + "Roles": [ + { + "Ref": "minimalargumentsLambdaFunctionServiceRole73B77FF7" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "minimalargumentsLambdaFunctionC19CFAAC": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "e0128dd6e376c58a74b37bd6178ded8a5909d414a6891c26547b9778ac25679b.zip" + }, + "Role": { + "Fn::GetAtt": [ + "minimalargumentsLambdaFunctionServiceRole73B77FF7", + "Arn" + ] + }, + "Environment": { + "Variables": { + "KENDRA_INDEX_ID": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Id" + ] + } + } + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "minimalargumentsLambdaFunctionServiceRoleDefaultPolicy59EC60ED", + "minimalargumentsLambdaFunctionServiceRole73B77FF7" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "minimalargumentskendraindexroleminimalargumentsB1DBDF7D": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "kendra.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Allow Kendra index to write CloudWatch Logs", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": "cloudwatch:PutMetricData", + "Condition": { + "StringEquals": { + "cloudwatch:namespace": "AWS/Kendra" + } + }, + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": "logs:CreateLogGroup", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + "Action": "logs:DescribeLogGroups", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + "logs:DescribeLogStream" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/kendra/*:log-stream:*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "AllowLogging" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W11", + "reason": "PutMetricData does not allow resource specification, scope is narrowed by the namespace condition. https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatch.html" + } + ] + } + } + }, + "minimalargumentskendraindexminimalarguments5CBDD236": { + "Type": "AWS::Kendra::Index", + "Properties": { + "Edition": "DEVELOPER_EDITION", + "Name": { + "Fn::Join": [ + "", + [ + "KendraIndexminimal-arguments-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + }, + "RoleArn": { + "Fn::GetAtt": [ + "minimalargumentskendraindexroleminimalargumentsB1DBDF7D", + "Arn" + ] + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W80", + "reason": "We consulted the Kendra TFC and they confirmed the default encryption is sufficient for general use cases" + } + ] + } + } + }, + "minimalargumentsdatasourceroleminimalarguments00EAC5006": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "kendra.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Policy for Kendra S3 Data Source", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:s3:::", + { + "Ref": "scrapBucketB11863B7" + }, + "/*" + ] + ] + } + }, + { + "Action": "s3:ListBucket", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:s3:::", + { + "Ref": "scrapBucketB11863B7" + } + ] + ] + } + }, + { + "Action": [ + "kendra:BatchPutDocument", + "kendra:BatchDeleteDocument" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "s3CrawlPolicy" + } + ] + } + }, + "minimalargumentsdatasourceminimalarguments05A02FF3B": { + "Type": "AWS::Kendra::DataSource", + "Properties": { + "IndexId": { + "Ref": "minimalargumentskendraindexminimalarguments5CBDD236" + }, + "Name": { + "Fn::Join": [ + "", + [ + "s3-datasourceminimal-arguments0-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + }, + "Type": "S3", + "DataSourceConfiguration": { + "S3Configuration": { + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + } + }, + "RoleArn": { + "Fn::GetAtt": [ + "minimalargumentsdatasourceroleminimalarguments00EAC5006", + "Arn" + ] + } + } + } + }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.ts new file mode 100644 index 000000000..0cd2fcb64 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.ts @@ -0,0 +1,44 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +// Imports +import { App, Stack } from "aws-cdk-lib"; +import { LambdaToKendra } from "../lib"; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as defaults from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; + +// Setup +const app = new App(); +const stack = new Stack(app, generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for aws-lambda-kendra'; + +const testBucket = defaults.CreateScrapBucket(stack); + +new LambdaToKendra(stack, 'minimal-arguments', { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + }, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucket.bucketName, + } + } + }], +}); + +suppressAutoDeleteHandlerWarnings(stack); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json new file mode 100644 index 000000000..9e715550e --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json @@ -0,0 +1,827 @@ +{ + "Description": "Integration Test for aws-lambda-kendra", + "Resources": { + "scrapBucketB11863B7": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W51", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W35", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W41", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct" + } + ] + } + } + }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, + "existingRole3E995BBA": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "kendra.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "minimalargumentsLambdaFunctionServiceRole73B77FF7": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "minimalargumentsLambdaFunctionServiceRoleDefaultPolicy59EC60ED": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": [ + "kendra:Query", + "kendra:Describe*", + "kendra:Get*", + "kendra:BatchGet*", + "kendra:List*", + "kendra:Retrieve" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Arn" + ] + } + }, + { + "Action": "kendra:SubmitFeedback", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "minimalargumentsLambdaFunctionServiceRoleDefaultPolicy59EC60ED", + "Roles": [ + { + "Ref": "minimalargumentsLambdaFunctionServiceRole73B77FF7" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "minimalargumentsLambdaFunctionC19CFAAC": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "e0128dd6e376c58a74b37bd6178ded8a5909d414a6891c26547b9778ac25679b.zip" + }, + "Role": { + "Fn::GetAtt": [ + "minimalargumentsLambdaFunctionServiceRole73B77FF7", + "Arn" + ] + }, + "Environment": { + "Variables": { + "KENDRA_INDEX_ID": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Id" + ] + } + } + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + } + }, + "DependsOn": [ + "minimalargumentsLambdaFunctionServiceRoleDefaultPolicy59EC60ED", + "minimalargumentsLambdaFunctionServiceRole73B77FF7" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "minimalargumentskendraindexroleminimalargumentsB1DBDF7D": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "kendra.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Allow Kendra index to write CloudWatch Logs", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": "cloudwatch:PutMetricData", + "Condition": { + "StringEquals": { + "cloudwatch:namespace": "AWS/Kendra" + } + }, + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": "logs:CreateLogGroup", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + "Action": "logs:DescribeLogGroups", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + "logs:DescribeLogStream" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/kendra/*:log-stream:*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "AllowLogging" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W11", + "reason": "PutMetricData does not allow resource specification, scope is narrowed by the namespace condition. https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatch.html" + } + ] + } + } + }, + "minimalargumentskendraindexminimalarguments5CBDD236": { + "Type": "AWS::Kendra::Index", + "Properties": { + "Edition": "DEVELOPER_EDITION", + "Name": { + "Fn::Join": [ + "", + [ + "KendraIndexminimal-arguments-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + }, + "RoleArn": { + "Fn::GetAtt": [ + "minimalargumentskendraindexroleminimalargumentsB1DBDF7D", + "Arn" + ] + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W80", + "reason": "We consulted the Kendra TFC and they confirmed the default encryption is sufficient for general use cases" + } + ] + } + } + }, + "minimalargumentsdatasourceroleminimalarguments00EAC5006": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "kendra.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Policy for Kendra S3 Data Source", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:s3:::", + { + "Ref": "scrapBucketB11863B7" + }, + "/*" + ] + ] + } + }, + { + "Action": "s3:ListBucket", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:s3:::", + { + "Ref": "scrapBucketB11863B7" + } + ] + ] + } + }, + { + "Action": [ + "kendra:BatchPutDocument", + "kendra:BatchDeleteDocument" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "s3CrawlPolicy" + } + ] + } + }, + "minimalargumentsdatasourceminimalarguments05A02FF3B": { + "Type": "AWS::Kendra::DataSource", + "Properties": { + "IndexId": { + "Ref": "minimalargumentskendraindexminimalarguments5CBDD236" + }, + "Name": { + "Fn::Join": [ + "", + [ + "s3-datasourceminimal-arguments0-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + }, + "Type": "S3", + "DataSourceConfiguration": { + "S3Configuration": { + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + } + }, + "RoleArn": { + "Fn::GetAtt": [ + "minimalargumentsdatasourceroleminimalarguments00EAC5006", + "Arn" + ] + } + } + }, + "minimalargumentskendradatasourceminimalarguments1DA6FACEE": { + "Type": "AWS::Kendra::DataSource", + "Properties": { + "IndexId": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Id" + ] + }, + "Name": "web-source", + "Type": "WEBCRAWLER", + "DataSourceConfiguration": { + "WebCrawlerConfiguration": { + "CrawlDepth": 1, + "Urls": { + "SeedUrlConfiguration": { + "SeedUrls": [ + "https://aws.amazon.com" + ] + } + } + } + }, + "RoleArn": { + "Fn::GetAtt": [ + "existingRole3E995BBA", + "Arn" + ] + } + } + } + }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.ts new file mode 100644 index 000000000..947f0f8c1 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.ts @@ -0,0 +1,68 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +// Imports +import { App, Stack } from "aws-cdk-lib"; +import { LambdaToKendra } from "../lib"; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import * as kendra from 'aws-cdk-lib/aws-kendra'; +import * as defaults from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; + +// Setup +const app = new App(); +const stack = new Stack(app, generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for aws-lambda-kendra'; + +const testBucket = defaults.CreateScrapBucket(stack); +const existingIamRole = new iam.Role(stack, 'existingRole', { + assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com') +}); + +const sourceProps: kendra.CfnDataSource.WebCrawlerConfigurationProperty = { + urls: { + seedUrlConfiguration: { + seedUrls: ["https://aws.amazon.com"] + } + }, + crawlDepth: 1, +}; + +const webCrawlerSource = { + name: "web-source", + roleArn: existingIamRole.roleArn, + type: "WEBCRAWLER", + dataSourceConfiguration: { + webCrawlerConfiguration: sourceProps + } +}; + +new LambdaToKendra(stack, 'minimal-arguments', { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + }, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucket.bucketName, + } + } + }, + webCrawlerSource ], +}); + +suppressAutoDeleteHandlerWarnings(stack); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json new file mode 100644 index 000000000..394098d54 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json @@ -0,0 +1,1221 @@ +{ + "Description": "Integration Test for aws-lambda-kendra", + "Resources": { + "scrapBucketB11863B7": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W51", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W35", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct implementation" + }, + { + "id": "W41", + "reason": "This S3 bucket is created for unit/ integration testing purposes only and not part of the actual construct" + } + ] + } + } + }, + "scrapBucketPolicy189B0607": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "scrapBucketB11863B7" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "scrapBucketB11863B7", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "scrapBucketAutoDeleteObjectsCustomResourceFFFC3275": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + }, + "DependsOn": [ + "scrapBucketPolicy189B0607" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "__entrypoint__.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs16.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "scrapBucketB11863B7" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } + }, + "minimalargumentsLambdaFunctionServiceRole73B77FF7": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/lambda/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "LambdaFunctionServiceRolePolicy" + } + ] + } + }, + "minimalargumentsLambdaFunctionServiceRoleDefaultPolicy59EC60ED": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "ec2:CreateNetworkInterface", + "ec2:DescribeNetworkInterfaces", + "ec2:DeleteNetworkInterface", + "ec2:AssignPrivateIpAddresses", + "ec2:UnassignPrivateIpAddresses" + ], + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": [ + "kendra:Query", + "kendra:Describe*", + "kendra:Get*", + "kendra:BatchGet*", + "kendra:List*", + "kendra:Retrieve" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Arn" + ] + } + }, + { + "Action": "kendra:SubmitFeedback", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "minimalargumentsLambdaFunctionServiceRoleDefaultPolicy59EC60ED", + "Roles": [ + { + "Ref": "minimalargumentsLambdaFunctionServiceRole73B77FF7" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W12", + "reason": "Lambda needs the following minimum required permissions to send trace data to X-Ray and access ENIs in a VPC." + } + ] + } + } + }, + "minimalargumentsReplaceDefaultSecurityGroupsecuritygroupFDD71705": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "with-vpc/minimal-arguments/ReplaceDefaultSecurityGroup-security-group", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W5", + "reason": "Egress of 0.0.0.0/0 is default and generally considered OK" + }, + { + "id": "W40", + "reason": "Egress IPProtocol of -1 is default and generally considered OK" + } + ] + } + } + }, + "minimalargumentsLambdaFunctionC19CFAAC": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "e0128dd6e376c58a74b37bd6178ded8a5909d414a6891c26547b9778ac25679b.zip" + }, + "Role": { + "Fn::GetAtt": [ + "minimalargumentsLambdaFunctionServiceRole73B77FF7", + "Arn" + ] + }, + "Environment": { + "Variables": { + "KENDRA_INDEX_ID": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Id" + ] + } + } + }, + "Handler": "index.handler", + "Runtime": "nodejs18.x", + "TracingConfig": { + "Mode": "Active" + }, + "VpcConfig": { + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "minimalargumentsReplaceDefaultSecurityGroupsecuritygroupFDD71705", + "GroupId" + ] + } + ], + "SubnetIds": [ + { + "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" + }, + { + "Ref": "VpcisolatedSubnet2Subnet39217055" + }, + { + "Ref": "VpcisolatedSubnet3Subnet44F2537D" + } + ] + } + }, + "DependsOn": [ + "minimalargumentsLambdaFunctionServiceRoleDefaultPolicy59EC60ED", + "minimalargumentsLambdaFunctionServiceRole73B77FF7", + "VpcisolatedSubnet1RouteTableAssociationD259E31A", + "VpcisolatedSubnet2RouteTableAssociation25A4716F", + "VpcisolatedSubnet3RouteTableAssociationDC010BEB" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "Lambda functions has the required permission to write CloudWatch Logs. It uses custom policy instead of arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole with tighter permissions." + }, + { + "id": "W89", + "reason": "This is not a rule for the general case, just for specific use cases/industries" + }, + { + "id": "W92", + "reason": "Impossible for us to define the correct concurrency for clients" + } + ] + } + } + }, + "minimalargumentskendraindexroleminimalargumentsB1DBDF7D": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "kendra.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Allow Kendra index to write CloudWatch Logs", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": "cloudwatch:PutMetricData", + "Condition": { + "StringEquals": { + "cloudwatch:namespace": "AWS/Kendra" + } + }, + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": "logs:CreateLogGroup", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + "Action": "logs:DescribeLogGroups", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + "logs:DescribeLogStream" + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:/aws/kendra/*:log-stream:*" + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "AllowLogging" + } + ] + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W11", + "reason": "PutMetricData does not allow resource specification, scope is narrowed by the namespace condition. https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatch.html" + } + ] + } + } + }, + "minimalargumentskendraindexminimalarguments5CBDD236": { + "Type": "AWS::Kendra::Index", + "Properties": { + "Edition": "DEVELOPER_EDITION", + "Name": { + "Fn::Join": [ + "", + [ + "KendraIndexminimal-arguments-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + }, + "RoleArn": { + "Fn::GetAtt": [ + "minimalargumentskendraindexroleminimalargumentsB1DBDF7D", + "Arn" + ] + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W80", + "reason": "We consulted the Kendra TFC and they confirmed the default encryption is sufficient for general use cases" + } + ] + } + } + }, + "minimalargumentsdatasourceroleminimalarguments00EAC5006": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "kendra.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Policy for Kendra S3 Data Source", + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:s3:::", + { + "Ref": "scrapBucketB11863B7" + }, + "/*" + ] + ] + } + }, + { + "Action": "s3:ListBucket", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:s3:::", + { + "Ref": "scrapBucketB11863B7" + } + ] + ] + } + }, + { + "Action": [ + "kendra:BatchPutDocument", + "kendra:BatchDeleteDocument" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "s3CrawlPolicy" + } + ] + } + }, + "minimalargumentsdatasourceminimalarguments05A02FF3B": { + "Type": "AWS::Kendra::DataSource", + "Properties": { + "IndexId": { + "Ref": "minimalargumentskendraindexminimalarguments5CBDD236" + }, + "Name": { + "Fn::Join": [ + "", + [ + "s3-datasourceminimal-arguments0-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + }, + "Type": "S3", + "DataSourceConfiguration": { + "S3Configuration": { + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + } + }, + "RoleArn": { + "Fn::GetAtt": [ + "minimalargumentsdatasourceroleminimalarguments00EAC5006", + "Arn" + ] + } + } + }, + "Vpc8378EB38": { + "Type": "AWS::EC2::VPC", + "Properties": { + "CidrBlock": "10.0.0.0/16", + "EnableDnsHostnames": true, + "EnableDnsSupport": true, + "InstanceTenancy": "default", + "Tags": [ + { + "Key": "Name", + "Value": "with-vpc/Vpc" + } + ] + } + }, + "VpcisolatedSubnet1SubnetE62B1B9B": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "AvailabilityZone": "test-region-1a", + "CidrBlock": "10.0.0.0/18", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "isolated" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Isolated" + }, + { + "Key": "Name", + "Value": "with-vpc/Vpc/isolatedSubnet1" + } + ] + } + }, + "VpcisolatedSubnet1RouteTableE442650B": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "Tags": [ + { + "Key": "Name", + "Value": "with-vpc/Vpc/isolatedSubnet1" + } + ] + } + }, + "VpcisolatedSubnet1RouteTableAssociationD259E31A": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VpcisolatedSubnet1RouteTableE442650B" + }, + "SubnetId": { + "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" + } + } + }, + "VpcisolatedSubnet2Subnet39217055": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "AvailabilityZone": "test-region-1b", + "CidrBlock": "10.0.64.0/18", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "isolated" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Isolated" + }, + { + "Key": "Name", + "Value": "with-vpc/Vpc/isolatedSubnet2" + } + ] + } + }, + "VpcisolatedSubnet2RouteTable334F9764": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "Tags": [ + { + "Key": "Name", + "Value": "with-vpc/Vpc/isolatedSubnet2" + } + ] + } + }, + "VpcisolatedSubnet2RouteTableAssociation25A4716F": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VpcisolatedSubnet2RouteTable334F9764" + }, + "SubnetId": { + "Ref": "VpcisolatedSubnet2Subnet39217055" + } + } + }, + "VpcisolatedSubnet3Subnet44F2537D": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "AvailabilityZone": "test-region-1c", + "CidrBlock": "10.0.128.0/18", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "isolated" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Isolated" + }, + { + "Key": "Name", + "Value": "with-vpc/Vpc/isolatedSubnet3" + } + ] + } + }, + "VpcisolatedSubnet3RouteTableA2F6BBC0": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "Tags": [ + { + "Key": "Name", + "Value": "with-vpc/Vpc/isolatedSubnet3" + } + ] + } + }, + "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VpcisolatedSubnet3RouteTableA2F6BBC0" + }, + "SubnetId": { + "Ref": "VpcisolatedSubnet3Subnet44F2537D" + } + } + }, + "VpcFlowLogIAMRole6A475D41": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "vpc-flow-logs.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Tags": [ + { + "Key": "Name", + "Value": "with-vpc/Vpc" + } + ] + } + }, + "VpcFlowLogIAMRoleDefaultPolicy406FB995": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + "logs:DescribeLogStreams" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "VpcFlowLogLogGroup7B5C56B9", + "Arn" + ] + } + }, + { + "Action": "iam:PassRole", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "VpcFlowLogIAMRole6A475D41", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "VpcFlowLogIAMRoleDefaultPolicy406FB995", + "Roles": [ + { + "Ref": "VpcFlowLogIAMRole6A475D41" + } + ] + } + }, + "VpcFlowLogLogGroup7B5C56B9": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "RetentionInDays": 731, + "Tags": [ + { + "Key": "Name", + "Value": "with-vpc/Vpc" + } + ] + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W84", + "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" + } + ] + } + } + }, + "VpcFlowLog8FF33A73": { + "Type": "AWS::EC2::FlowLog", + "Properties": { + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", + "DeliverLogsPermissionArn": { + "Fn::GetAtt": [ + "VpcFlowLogIAMRole6A475D41", + "Arn" + ] + }, + "LogDestinationType": "cloud-watch-logs", + "LogGroupName": { + "Ref": "VpcFlowLogLogGroup7B5C56B9" + }, + "Tags": [ + { + "Key": "Name", + "Value": "with-vpc/Vpc" + } + ], + "TrafficType": "ALL" + } + }, + "VpcKENDRAD98378E1": { + "Type": "AWS::EC2::VPCEndpoint", + "Properties": { + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".kendra" + ] + ] + }, + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "withvpcKENDRAsecuritygroup6E04E691", + "GroupId" + ] + } + ], + "SubnetIds": [ + { + "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" + }, + { + "Ref": "VpcisolatedSubnet2Subnet39217055" + }, + { + "Ref": "VpcisolatedSubnet3Subnet44F2537D" + } + ], + "VpcEndpointType": "Interface" + } + }, + "withvpcKENDRAsecuritygroup6E04E691": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "with-vpc/with-vpc-KENDRA-security-group", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "SecurityGroupIngress": [ + { + "CidrIp": { + "Fn::GetAtt": [ + "Vpc8378EB38", + "CidrBlock" + ] + }, + "Description": { + "Fn::Join": [ + "", + [ + "from ", + { + "Fn::GetAtt": [ + "Vpc8378EB38", + "CidrBlock" + ] + }, + ":443" + ] + ] + }, + "FromPort": 443, + "IpProtocol": "tcp", + "ToPort": 443 + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + }, + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W5", + "reason": "Egress of 0.0.0.0/0 is default and generally considered OK" + }, + { + "id": "W40", + "reason": "Egress IPProtocol of -1 is default and generally considered OK" + } + ] + } + } + } + }, + "Mappings": { + "DefaultCrNodeVersionMap": { + "af-south-1": { + "value": "nodejs16.x" + }, + "ap-east-1": { + "value": "nodejs16.x" + }, + "ap-northeast-1": { + "value": "nodejs16.x" + }, + "ap-northeast-2": { + "value": "nodejs16.x" + }, + "ap-northeast-3": { + "value": "nodejs16.x" + }, + "ap-south-1": { + "value": "nodejs16.x" + }, + "ap-south-2": { + "value": "nodejs16.x" + }, + "ap-southeast-1": { + "value": "nodejs16.x" + }, + "ap-southeast-2": { + "value": "nodejs16.x" + }, + "ap-southeast-3": { + "value": "nodejs16.x" + }, + "ca-central-1": { + "value": "nodejs16.x" + }, + "cn-north-1": { + "value": "nodejs16.x" + }, + "cn-northwest-1": { + "value": "nodejs16.x" + }, + "eu-central-1": { + "value": "nodejs16.x" + }, + "eu-central-2": { + "value": "nodejs16.x" + }, + "eu-north-1": { + "value": "nodejs16.x" + }, + "eu-south-1": { + "value": "nodejs16.x" + }, + "eu-south-2": { + "value": "nodejs16.x" + }, + "eu-west-1": { + "value": "nodejs16.x" + }, + "eu-west-2": { + "value": "nodejs16.x" + }, + "eu-west-3": { + "value": "nodejs16.x" + }, + "me-central-1": { + "value": "nodejs16.x" + }, + "me-south-1": { + "value": "nodejs16.x" + }, + "sa-east-1": { + "value": "nodejs16.x" + }, + "us-east-1": { + "value": "nodejs16.x" + }, + "us-east-2": { + "value": "nodejs16.x" + }, + "us-gov-east-1": { + "value": "nodejs16.x" + }, + "us-gov-west-1": { + "value": "nodejs16.x" + }, + "us-iso-east-1": { + "value": "nodejs14.x" + }, + "us-iso-west-1": { + "value": "nodejs14.x" + }, + "us-isob-east-1": { + "value": "nodejs14.x" + }, + "us-west-1": { + "value": "nodejs16.x" + }, + "us-west-2": { + "value": "nodejs16.x" + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.ts new file mode 100644 index 000000000..776d83f26 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.ts @@ -0,0 +1,45 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +// Imports +import { App, Stack } from "aws-cdk-lib"; +import { LambdaToKendra } from "../lib"; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as defaults from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; + +// Setup +const app = new App(); +const stack = new Stack(app, generateIntegStackName(__filename)); +stack.templateOptions.description = 'Integration Test for aws-lambda-kendra'; + +const testBucket = defaults.CreateScrapBucket(stack); + +new LambdaToKendra(stack, 'minimal-arguments', { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + }, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucket.bucketName, + } + } + }], + deployVpc: true +}); + +suppressAutoDeleteHandlerWarnings(stack); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts new file mode 100644 index 000000000..df13e471c --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts @@ -0,0 +1,1040 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { LambdaToKendra } from "../lib"; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as ec2 from 'aws-cdk-lib/aws-ec2'; +import * as kendra from 'aws-cdk-lib/aws-kendra'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import * as cdk from "aws-cdk-lib"; +import { Template } from 'aws-cdk-lib/assertions'; +import * as defaults from '@aws-solutions-constructs/core'; + +test.only('Launch with minimal code and check structure', () => { + const stack = new cdk.Stack(); + const testFunctionName = 'test-function-name24334'; + const testBucketName = 'test-bucket-name12344'; + + const lambdaProps: lambda.FunctionProps = { + functionName: testFunctionName, + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ] + }); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::Lambda::Function", { + FunctionName: testFunctionName, + Environment: { + Variables: { + KENDRA_INDEX_ID: { + "Fn::GetAtt": ["samplekendraindexsample8A81A6C2", "Id"] + } + } + }, + }); + template.hasResourceProperties("AWS::Kendra::Index", { + RoleArn: { + "Fn::GetAtt": [ + "samplekendraindexrolesample4F9E7B66", + "Arn", + ], + }, + }); + template.hasResourceProperties("AWS::Kendra::DataSource", { + Type: 'S3', + DataSourceConfiguration: { + S3Configuration: { + BucketName: testBucketName + }, + }, + RoleArn: { + "Fn::GetAtt": ["sampledatasourcerolesample05A05F8BD", "Arn"] + }, + }); + // Confirm policy for Kendra index + template.hasResourceProperties("AWS::IAM::Role", { + Description: "Allow Kendra index to write CloudWatch Logs", + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Action: "cloudwatch:PutMetricData", + Condition: { + StringEquals: { + "cloudwatch:namespace": "AWS/Kendra" + } + }, + Effect: "Allow", + Resource: "*" + }, + { + Action: "logs:CreateLogGroup", + Effect: "Allow", + Resource: { + "Fn::Join": [ + "", + [ + "arn:aws:logs:", + { + Ref: "AWS::Region" + }, + ":", + { + Ref: "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + Action: "logs:DescribeLogGroups", + Effect: "Allow", + Resource: { + "Fn::Join": [ + "", + [ + "arn:", + { + Ref: "AWS::Partition" + }, + ":logs:", + { + Ref: "AWS::Region" + }, + ":", + { + Ref: "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + Action: [ + "logs:CreateLogStream", + "logs:PutLogEvents", + "logs:DescribeLogStream" + ], + Effect: "Allow", + Resource: { + "Fn::Join": [ + "", + [ + "arn:", + { + Ref: "AWS::Partition" + }, + ":logs:", + { + Ref: "AWS::Region" + }, + ":", + { + Ref: "AWS::AccountId" + }, + ":log-group:/aws/kendra/*:log-stream:*" + ] + ] + } + } + ], + Version: "2012-10-17" + }, + PolicyName: "AllowLogging" + } + ], + }); + // Confirm policy for Kendra index + template.hasResourceProperties("AWS::IAM::Role", { + Description: "Policy for Kendra S3 Data Source", + AssumeRolePolicyDocument: { + Statement: [ + { + Action: "sts:AssumeRole", + Effect: "Allow", + Principal: { + Service: "kendra.amazonaws.com" + } + } + ], + Version: "2012-10-17" + }, + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Action: "s3:GetObject", + Effect: "Allow", + Resource: `arn:aws:s3:::test-bucket-name12344/*` + }, + { + Action: "s3:ListBucket", + Effect: "Allow", + Resource: `arn:aws:s3:::test-bucket-name12344` + }, + { + Action: [ + "kendra:BatchPutDocument", + "kendra:BatchDeleteDocument" + ], + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "samplekendraindexsample8A81A6C2", + "Arn" + ] + } + } + ], + Version: "2012-10-17" + }, + PolicyName: "s3CrawlPolicy" + } + ] + }); + // Confirm that Lambda function has QUERY access + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyDocument: { + Statement: [ + { + Action: [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + Effect: "Allow", + Resource: "*" + }, + { + Action: [ + "kendra:Query", + "kendra:Describe*", + "kendra:Get*", + "kendra:BatchGet*", + "kendra:List*", + "kendra:Retrieve", + ], + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "samplekendraindexsample8A81A6C2", + "Arn" + ] + } + }, + { + Action: "kendra:SubmitFeedback", + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "samplekendraindexsample8A81A6C2", + "Arn" + ] + } + } + ], + }, + Roles: [ + { + Ref: "sampletestfunctionname24334ServiceRole99395A01" + } + ] + }); +}); + +test('Check pattern properties on minimal launch', () => { + const stack = new cdk.Stack(); + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + const newConstruct = new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: 'your-bucket-name', + } + } + } + ], + }); + + expect(newConstruct.lambdaFunction).toBeDefined(); + expect(newConstruct.kendraDataSources).toBeDefined(); + expect(newConstruct.kendraDataSources.length).toEqual(1); + expect(newConstruct.kendraIndex).toBeDefined(); + +}); + +test('Launch with VPC', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name12539'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'sample', { + deployVpc: true, + lambdaFunctionProps: lambdaProps, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ], + }); + + const template = Template.fromStack(stack); + + // Check the VPC + template.hasResourceProperties("AWS::EC2::VPC", { + CidrBlock: "10.0.0.0/16", + EnableDnsHostnames: true, + EnableDnsSupport: true, + InstanceTenancy: "default", + }); + + // Is the Lambda function associated with the VPC + template.hasResourceProperties("AWS::Lambda::Function", { + VpcConfig: { + SecurityGroupIds: [ + { + "Fn::GetAtt": [ + "sampleReplaceDefaultSecurityGroupsecuritygroupE5725669", + "GroupId" + ] + } + ], + SubnetIds: [ + { + Ref: "VpcisolatedSubnet1SubnetE62B1B9B" + }, + { + Ref: "VpcisolatedSubnet2Subnet39217055" + } + ] + } + }); + // Check that the Lambda function Policy has proper network access + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyDocument: { + Statement: [ + { + Action: [ + "ec2:CreateNetworkInterface", + "ec2:DescribeNetworkInterfaces", + "ec2:DeleteNetworkInterface", + "ec2:AssignPrivateIpAddresses", + "ec2:UnassignPrivateIpAddresses" + ], + Effect: "Allow", + Resource: "*" + }, + {}, + {}, + {} + ], + }, + Roles: [ + { + Ref: "sampleLambdaFunctionServiceRole7A3C4AF5" + } + ] + }); + + // Check for the Kendra endpoint in the VPC + template.hasResourceProperties("AWS::EC2::VPCEndpoint", { + ServiceName: { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + Ref: "AWS::Region" + }, + ".kendra" + ] + ] + }, + VpcId: { + Ref: "Vpc8378EB38" + }, + PrivateDnsEnabled: true, + SecurityGroupIds: [ + { + "Fn::GetAtt": [ + "DefaultKENDRAsecuritygroup34536A79", + "GroupId" + ] + } + ], + SubnetIds: [ + { + Ref: "VpcisolatedSubnet1SubnetE62B1B9B" + }, + { + Ref: "VpcisolatedSubnet2Subnet39217055" + } + ], + VpcEndpointType: "Interface" + }); +}); + +test('Launch with existing lambda', () => { + const stack = new cdk.Stack(); + const testTimeout = 17; + + const testFunctionName = 'test-name'; + + const existingFunction = new lambda.Function(stack, 'existing-function', { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + timeout: cdk.Duration.seconds(testTimeout), + functionName: testFunctionName + }); + + new LambdaToKendra(stack, 'sample', { + existingLambdaObj: existingFunction, + kendraDataSourcesProps: [], + }); + + const template = Template.fromStack(stack); + template.resourceCountIs("AWS::Lambda::Function", 1); + template.hasResourceProperties("AWS::Lambda::Function", { + Timeout: testTimeout, + FunctionName: testFunctionName, + }); +}); + +test('Confirm error with existing vpc and vpc props', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name22'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + const app = () => { + new LambdaToKendra(stack, 'sample', { + existingVpc: defaults.getTestVpc(stack), + deployVpc: true, + vpcProps: { + ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16') + }, + lambdaFunctionProps: lambdaProps, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ], + }); + }; + + expect(app).toThrowError(/Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n/); +}); + +test('Confirm error with data source with no bucket name', () => { + const stack = new cdk.Stack(); + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + const app = () => { + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + } + } + } + ], + }); + }; + + expect(app).toThrowError(/Error - an S3 Kendra DataSource requires the DataSourceCofiguration.S3Configuration.bucketName prop/); +}); + +test('Launch with existing vpc', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name22'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'sample', { + existingVpc: defaults.getTestVpc(stack), + lambdaFunctionProps: lambdaProps, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ], + }); + + const template = Template.fromStack(stack); + template.resourceCountIs("AWS::EC2::VPC", 1); + template.resourceCountIs("AWS::EC2::VPCEndpoint", 1); + template.hasResourceProperties("AWS::EC2::VPC", { + EnableDnsHostnames: true, + EnableDnsSupport: true, + }); + +}); + +test('Launch with Read/Write permissions on kendra index', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name22'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + indexPermissions: ["ReaD", "SubmitFeedBack", "wrITE"], // this also checks case sensitivity + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ], + }); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyDocument: { + Statement: [ + { + Action: [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + Effect: "Allow", + Resource: "*" + }, + { + Action: [ + "kendra:Query", + "kendra:Describe*", + "kendra:Get*", + "kendra:BatchGet*", + "kendra:List*", + "kendra:Retrieve", + ], + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "samplekendraindexsample8A81A6C2", + "Arn" + ] + } + }, + { + Action: "kendra:SubmitFeedback", + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "samplekendraindexsample8A81A6C2", + "Arn" + ] + } + }, + { + Action: [ + "kendra:Associate*", + "kendra:BatchPut*", + "kendra:Clear", + "kendra:Create*", + "kendra:Delete*", + "kendra:Disassociate*", + "kendra:Put*", + "kendra:Update*", + "kendra:Start*", + "kendra:Submit*", + "kendra:Stop*", + "kendra:TagResource", + "kendra:UntagResource" + ], + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "samplekendraindexsample8A81A6C2", + "Arn" + ] + } + } + ] + } + }); +}); + +test('Launch with Write permissions on kendra index', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name22'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + indexPermissions: ["WRITE"], + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ], + }); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyDocument: { + Statement: [ + { + Action: [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + Effect: "Allow", + Resource: "*" + }, + { + Action: [ + "kendra:Associate*", + "kendra:BatchPut*", + "kendra:Clear", + "kendra:Create*", + "kendra:Delete*", + "kendra:Disassociate*", + "kendra:Put*", + "kendra:Update*", + "kendra:Start*", + "kendra:Submit*", + "kendra:Stop*", + "kendra:TagResource", + "kendra:UntagResource" + ], + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "samplekendraindexsample8A81A6C2", + "Arn" + ] + } + } + ] + } + }); +}); + +test('Launch with Read permissions on kendra index', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name22'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + indexPermissions: ["READ"], + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ], + }); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyDocument: { + Statement: [ + { + Action: [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + Effect: "Allow", + Resource: "*" + }, + { + Action: [ + "kendra:Query", + "kendra:Describe*", + "kendra:Get*", + "kendra:BatchGet*", + "kendra:List*", + "kendra:Retrieve", + ], + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "samplekendraindexsample8A81A6C2", + "Arn" + ] + } + } + ] + } + }); +}); + +test('Launch with SubmitFeedback permissions on kendra index', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name22'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + indexPermissions: ["SUBMITFEEDBACK"], + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ], + }); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyDocument: { + Statement: [ + { + Action: [ + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" + ], + Effect: "Allow", + Resource: "*" + }, + { + Action: "kendra:SubmitFeedback", + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "samplekendraindexsample8A81A6C2", + "Arn" + ] + } + } + ] + } + }); +}); + +test('Launch with existing kendra index', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name22'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + const existingRole = new iam.Role(stack, 'existing-role', { + assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com'), + }); + + const existingIndex = new kendra.CfnIndex(stack, 'existing-index', { + edition: 'ENTERPRISE', + name: 'existingIndex', + roleArn: existingRole.roleArn + }); + + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + indexPermissions: ["WRITE"], + existingKendraIndexObj: existingIndex, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ], + }); + + const template = Template.fromStack(stack); + + // Make sure we didn't create an index anyway + template.resourceCountIs("AWS::Kendra::Index", 1); + template.hasResourceProperties("AWS::Kendra::Index", { + Edition: 'ENTERPRISE' + }); +}); + +test('Launch with S3 data source with overridden defaults', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name223423'; + const testInclusionPattern = 'this-folder'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + indexPermissions: ["WRITE"], + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + inclusionPatterns: [testInclusionPattern], + bucketName: testBucketName, + } + } + } + ], + }); + + const template = Template.fromStack(stack); + template.resourceCountIs("AWS::Kendra::DataSource", 1); + template.hasResourceProperties("AWS::Kendra::DataSource", { + Type: 'S3', + DataSourceConfiguration: { + S3Configuration: { + InclusionPatterns: [testInclusionPattern], + BucketName: testBucketName + }, + } + }); +}); + +test('Launch with S3 data source and unsupported data source', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name22'; + const nonImplementedSourceType = "WEBCRAWLER"; + const nonImplementedSourceName = "test-other-source"; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + // Create a role + const fakeRole = new iam.Role(stack, 'fakeRole', { + assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com'), + roleName: 'externalFakeRole' + }); + + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + indexPermissions: ["WRITE"], + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + }, + { + name: nonImplementedSourceName, + roleArn: fakeRole.roleArn, + type: nonImplementedSourceType, + }], + }); + + const template = Template.fromStack(stack); + template.resourceCountIs("AWS::Kendra::DataSource", 2); + + template.hasResourceProperties("AWS::Kendra::DataSource", { + Type: 'S3', + DataSourceConfiguration: { + S3Configuration: { + BucketName: testBucketName + }, + }, + RoleArn: { + "Fn::GetAtt": ["sampledatasourcerolesample05A05F8BD", "Arn"] + }, + }); + template.hasResourceProperties("AWS::Kendra::DataSource", { + Name: nonImplementedSourceName, + Type: nonImplementedSourceType, + }); + +}); + +test('Launch with multiple S3 data sources', () => { + const stack = new cdk.Stack(); + const testBucketName = 'test-bucket-name22342'; + const secondBucketName = 'second-bucket-name22342342'; + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'two-sources', { + lambdaFunctionProps: lambdaProps, + indexPermissions: ["WRITE"], + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + }, + { + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: secondBucketName, + } + } + }], + }); + + const template = Template.fromStack(stack); + template.resourceCountIs("AWS::Kendra::DataSource", 2); + template.hasResourceProperties("AWS::Kendra::DataSource", { + Type: 'S3', + DataSourceConfiguration: { + S3Configuration: { + BucketName: testBucketName + }, + }, + RoleArn: { + "Fn::GetAtt": ["twosourcesdatasourceroletwosources0B8E24996", "Arn"] + }, + }); + template.hasResourceProperties("AWS::Kendra::DataSource", { + Type: 'S3', + DataSourceConfiguration: { + S3Configuration: { + BucketName: secondBucketName + }, + }, + RoleArn: { + "Fn::GetAtt": ["twosourcesdatasourceroletwosources164176C5E", "Arn"] + }, + }); +}); + +test('Test with custom environment variable name', () => { + const stack = new cdk.Stack(); + + const lambdaProps: lambda.FunctionProps = { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + new LambdaToKendra(stack, 'sample', { + lambdaFunctionProps: lambdaProps, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: 'your-bucket-name', + } + } + } + ], + indexIdEnvironmentVariableName: "MY_VAR_NAME", + }); + + const template = Template.fromStack(stack); + + template.hasResourceProperties("AWS::Lambda::Function", { + Environment: { + Variables: { + MY_VAR_NAME: { + "Fn::GetAtt": ["samplekendraindexsample8A81A6C2", "Id"] + } + } + } + }); + +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda/index.js b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda/index.js new file mode 100644 index 000000000..3c81710ce --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda/index.js @@ -0,0 +1,8 @@ +exports.handler = async function(event) { + console.log('request:', JSON.stringify(event, undefined, 2)); + return { + statusCode: 200, + headers: { 'Content-Type': 'text/plain' }, + body: `Stub Lambda function for testing - ${event.path}\n` + }; + }; \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/package.json index 410688503..52c3932da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/package.json index ef068cafd..244610868 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json index 9ae4539af..740aeea46 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/package.json index e692caf20..d77b5c82c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/package.json index 132469759..d7bd7905b 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json index f0a06d0a3..e9723e9eb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json index 281d0f87c..393f1fa79 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json index e267670bb..a6c6f68fa 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/package.json index 17e47393b..3832d4536 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/package.json index f02357455..33209346c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/package.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/package.json index 9ca4e2c33..f39c56640 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/package.json b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/package.json index 8946e168a..603244834 100755 --- a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json index d1f30a615..06f505371 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/package.json index 571c95e30..53683665d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/package.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/package.json index b32c965e3..b49393755 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json index 6fd0ea602..5f064d71f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json index 35164cac5..3ba34b00e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json index 56e25ae7a..2fe74d18a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/package.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/package.json index bc2f80938..a09984c62 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/package.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/package.json index 87a219833..0c057d852 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/package.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/package.json index fce80f599..8b43b8dbb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "integ-no-clean": "cdk-integ --no-clean", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", diff --git a/source/patterns/@aws-solutions-constructs/core/index.ts b/source/patterns/@aws-solutions-constructs/core/index.ts index 7ad6ee16d..c35ed2b18 100644 --- a/source/patterns/@aws-solutions-constructs/core/index.ts +++ b/source/patterns/@aws-solutions-constructs/core/index.ts @@ -71,4 +71,5 @@ export * from './lib/eventbridge-helper'; export * from './lib/waf-defaults'; export * from './lib/waf-helper'; export * from './lib/opensearch-defaults'; -export * from './lib/opensearch-helper'; \ No newline at end of file +export * from './lib/opensearch-helper'; +export * from './lib/kendra-helper'; diff --git a/source/patterns/@aws-solutions-constructs/core/lib/kendra-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/kendra-defaults.ts new file mode 100644 index 000000000..9901947bc --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/core/lib/kendra-defaults.ts @@ -0,0 +1,26 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import * as kendra from 'aws-cdk-lib/aws-kendra'; +import { generatePhysicalName } from "./utils"; + +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + */ +export function DefaultKendraIndexProps(id: string, roleArn?: string): kendra.CfnIndexProps { + return { + name: generatePhysicalName("", ["KendraIndex", id], 1000), + roleArn, + edition: 'DEVELOPER_EDITION', + } as kendra.CfnIndexProps; +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts new file mode 100644 index 000000000..0b88b9edc --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts @@ -0,0 +1,254 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +/* + * The functions found here in the core library are for internal use and can be changed + * or removed outside of a major release. We recommend against calling them directly from client code. + */ + +import * as kendra from 'aws-cdk-lib/aws-kendra'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import { addCfnSuppressRules, consolidateProps } from "./utils"; +import { Aws } from 'aws-cdk-lib'; + +// Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate +import { Construct } from 'constructs'; +import { DefaultKendraIndexProps } from './kendra-defaults'; +import { generatePhysicalName, overrideProps } from "./utils"; + +export interface BuildKendraIndexProps { + readonly kendraIndexProps?: kendra.CfnIndexProps | any; + /** + * Existing instance of Kendra Index object, Providing both this and kendraIndexProps will cause an error. + * + * @default - None + */ + readonly existingIndexObj?: kendra.CfnIndex; +} + +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + */ +export function buildKendraIndex(scope: Construct, id: string, props: BuildKendraIndexProps): kendra.CfnIndex { + // Conditional lambda function creation + if (props.existingIndexObj) { + // The client provided an Index, so we'll do nothing and return it to them + return props.existingIndexObj; + } else { + + let indexRoleArn: string = ""; + + // If the client provided a role, then don't bother creating a new one that we don't need + if (!props.kendraIndexProps?.roleArn) { + indexRoleArn = CreateKendraIndexLoggingRole(scope, id); + } + const defaultIndexProperties = DefaultKendraIndexProps(id, indexRoleArn); + + const consolidatedIndexProperties = consolidateProps(defaultIndexProperties, props.kendraIndexProps); + const newIndex = new kendra.CfnIndex(scope, `kendra-index-${id}`, consolidatedIndexProperties); + addCfnSuppressRules(newIndex, [{ + id: "W80", + reason: "We consulted the Kendra TFC and they confirmed the default encryption is sufficient for general use cases" + }]); + + return newIndex; + } +} + +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + */ +export function AddMultipleKendraDataSources(scope: Construct, + id: string, + kendraIndex: kendra.CfnIndex, + clientDataSourceProps: Array>): kendra.CfnDataSource[] { + + const returnDataSources: kendra.CfnDataSource[] = []; + clientDataSourceProps.forEach((props, index) => { + returnDataSources.push(AddKendraDataSource(scope, `${id}${index}`, kendraIndex, props)); + }); + return returnDataSources; +} + +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + */ +export function AddKendraDataSource(scope: Construct, + id: string, index: kendra.CfnIndex, + clientDataSourceProps: kendra.CfnDataSourceProps | any): kendra.CfnDataSource { + + if (clientDataSourceProps.type === 'S3') { + return CreateS3DataSource(scope, index, id, clientDataSourceProps); + } else { + if (clientDataSourceProps.indexId) { + throw new Error('Invalid DataSource prop specified - Construct must set the indexId prop'); + } + return new kendra.CfnDataSource(scope, `kendra-data-source-${id}`, { + ...clientDataSourceProps, + indexId: index.attrId + }); + } +} + +function CreateS3DataSource(scope: Construct, + targetIndex: kendra.CfnIndex, + id: string, + clientProps: Partial): kendra.CfnDataSource { + + // We go through some hoops here to extract the various inputs, because we need to narrow + // the type to remove the union with IResolvable + const dataSourceConfig = clientProps.dataSourceConfiguration as kendra.CfnDataSource.DataSourceConfigurationProperty; + if (!dataSourceConfig) { + throw new Error('Error - an S3 Kendra DataSource requires an DataSourceCofiguration prop'); + } + + const s3DataSourceConfig = dataSourceConfig.s3Configuration as kendra.CfnDataSource.S3DataSourceConfigurationProperty; + + if (!s3DataSourceConfig) { + throw new Error('Error - an S3 Kendra DataSource requires an DataSourceCofiguration.S3Configuration prop'); + } + + // No Bucket name is an error + if (!s3DataSourceConfig.bucketName) { + throw new Error('Error - an S3 Kendra DataSource requires the DataSourceCofiguration.S3Configuration.bucketName prop'); + } + + // If there's no role, make a role and put it into defaultProps + // Put bucket name in default props + let defaultProps: kendra.CfnDataSourceProps = { + indexId: targetIndex.ref, + name: generatePhysicalName('', ['s3-datasource', id], 1000), + type: 'S3' + }; + + // Return consolidated default and user props + if (!clientProps.roleArn) { + const s3CrawlPolicy = new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + actions: [ + "s3:GetObject" + ], + resources: [ + `arn:aws:s3:::${s3DataSourceConfig.bucketName}/*` + ], + effect: iam.Effect.ALLOW + }), + new iam.PolicyStatement({ + actions: [ + "s3:ListBucket" + ], + resources: [ + `arn:aws:s3:::${s3DataSourceConfig.bucketName}` + ], + effect: iam.Effect.ALLOW + }), + new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + actions: [ + "kendra:BatchPutDocument", + "kendra:BatchDeleteDocument" + ], + resources: [ + targetIndex.attrArn + ] + }), + ] + }); + + const dataSourceRole: iam.Role = new iam.Role(scope, `data-source-role-${id}`, { + assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com'), + description: 'Policy for Kendra S3 Data Source', + inlinePolicies: { + s3CrawlPolicy, + }, + }); + defaultProps = overrideProps(defaultProps, { roleArn: dataSourceRole.roleArn }); + } + + const consolidatedProps: kendra.CfnDataSourceProps = consolidateProps(defaultProps, clientProps); + + return new kendra.CfnDataSource(scope, `data-source-${id}`, consolidatedProps); + +} + +function CreateKendraIndexLoggingRole(scope: Construct, id: string): string { + const allowKendraToLogPolicy = new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + resources: ['*'], + actions: [ + "cloudwatch:PutMetricData" + ], + effect: iam.Effect.ALLOW, + conditions: { + StringEquals: { + "cloudwatch:namespace": "AWS/Kendra" + } + } + }), + new iam.PolicyStatement({ + resources: [`arn:aws:logs:${Aws.REGION}:${Aws.ACCOUNT_ID}:log-group:/aws/kendra/*`], + actions: [ + "logs:CreateLogGroup" + ], + effect: iam.Effect.ALLOW, + }), + new iam.PolicyStatement({ + resources: [`arn:${Aws.PARTITION}:logs:${Aws.REGION}:${Aws.ACCOUNT_ID}:log-group:/aws/kendra/*`], + actions: [ + "logs:DescribeLogGroups" + ], + effect: iam.Effect.ALLOW, + }), + new iam.PolicyStatement({ + resources: [`arn:${Aws.PARTITION}:logs:${Aws.REGION}:${Aws.ACCOUNT_ID}:log-group:/aws/kendra/*:log-stream:*`], + actions: [ + 'logs:CreateLogStream', + 'logs:PutLogEvents', + 'logs:DescribeLogStream', + ], + effect: iam.Effect.ALLOW, + }), + ], + }); + + const indexRole: iam.Role = new iam.Role(scope, `kendra-index-role-${id}`, { + assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com'), + description: 'Allow Kendra index to write CloudWatch Logs', + inlinePolicies: { + AllowLogging: allowKendraToLogPolicy, + }, + }); + addCfnSuppressRules(indexRole, [{ + id: "W11", + reason: "PutMetricData does not allow resource specification, " + + "scope is narrowed by the namespace condition. " + + "https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatch.html" + }]); + return indexRole.roleArn; +} + +// @summary Confirm each entry is a correct value, uppercase each entry +export function normalizeKendraPermissions(rawPermissions: string[]): string[] { + const validPermissions = ["READ", "SUBMITFEEDBACK", "WRITE"]; + + const result = rawPermissions.map((s) => { + const upperCaseValue = s.toUpperCase(); + if (!validPermissions.includes(upperCaseValue)) { + throw new Error(`Invalid indexPermission value - valid values are "READ", "SUBMITFEEDBACK" and "WRITE"`); + } + return upperCaseValue; + }); + return result; +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts index 542dc9f1d..6ca739ca4 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts @@ -78,7 +78,8 @@ export enum ServiceEndpointTypes { ECR_DKR = "ECR_DKR", EVENTS = "CLOUDWATCH_EVENTS", KINESIS_FIREHOSE = "KINESIS_FIREHOSE", - KINESIS_STREAMS = "KINESIS_STREAMS" + KINESIS_STREAMS = "KINESIS_STREAMS", + KENDRA = "KENDRA" } enum EndpointTypes { @@ -158,6 +159,11 @@ const endpointSettings: EndpointDefinition[] = [ endpointName: ServiceEndpointTypes.KINESIS_STREAMS, endpointType: EndpointTypes.INTERFACE, endpointInterfaceService: ec2.InterfaceVpcEndpointAwsService.KINESIS_STREAMS + }, + { + endpointName: ServiceEndpointTypes.KENDRA, + endpointType: EndpointTypes.INTERFACE, + endpointInterfaceService: ec2.InterfaceVpcEndpointAwsService.KENDRA } ]; diff --git a/source/patterns/@aws-solutions-constructs/core/package.json b/source/patterns/@aws-solutions-constructs/core/package.json index af8148840..98f6fdf47 100644 --- a/source/patterns/@aws-solutions-constructs/core/package.json +++ b/source/patterns/@aws-solutions-constructs/core/package.json @@ -23,7 +23,7 @@ "clean": "tsc -b --clean", "watch": "tsc -b -w", "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "jsii": "jsii", "jsii-pacmak": "jsii-pacmak", "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", diff --git a/source/patterns/@aws-solutions-constructs/core/test/kendra-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/kendra-helper.test.ts new file mode 100644 index 000000000..8e934d19a --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/core/test/kendra-helper.test.ts @@ -0,0 +1,555 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { Stack } from 'aws-cdk-lib'; +// import * as defaults from '../index'; +import { Match, Template } from 'aws-cdk-lib/assertions'; +import { buildKendraIndex, AddKendraDataSource, AddMultipleKendraDataSources, normalizeKendraPermissions } from '../lib/kendra-helper'; +import * as kendra from 'aws-cdk-lib/aws-kendra'; +import * as iam from 'aws-cdk-lib/aws-iam'; + +// import { Construct } from 'constructs'; + +test('Launch Kendra index with defaults', () => { + const stack = new Stack(undefined, undefined); + + buildKendraIndex(stack, 'test', {}); + + const template = Template.fromStack(stack); + template.hasResourceProperties('AWS::Kendra::Index', {}); + template.resourceCountIs("AWS::IAM::Role", 1); +}); + +test('Confirm kendra has log wrting privileges', () => { + const stack = new Stack(undefined, undefined); + + buildKendraIndex(stack, 'test', {}); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::IAM::Role", { + Description: "Allow Kendra index to write CloudWatch Logs", + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Action: "cloudwatch:PutMetricData", + Condition: { + StringEquals: { + "cloudwatch:namespace": "AWS/Kendra" + } + }, + Effect: "Allow", + Resource: "*" + }, + { + Action: "logs:CreateLogGroup", + Effect: "Allow", + Resource: { + "Fn::Join": [ + "", + [ + "arn:aws:logs:", + { + Ref: "AWS::Region" + }, + ":", + { + Ref: "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + Action: "logs:DescribeLogGroups", + Effect: "Allow", + Resource: { + "Fn::Join": [ + "", + [ + "arn:", + { + Ref: "AWS::Partition" + }, + ":logs:", + { + Ref: "AWS::Region" + }, + ":", + { + Ref: "AWS::AccountId" + }, + ":log-group:/aws/kendra/*" + ] + ] + } + }, + { + Action: [ + "logs:CreateLogStream", + "logs:PutLogEvents", + "logs:DescribeLogStream" + ], + Effect: "Allow", + Resource: { + "Fn::Join": [ + "", + [ + "arn:", + { + Ref: "AWS::Partition" + }, + ":logs:", + { + Ref: "AWS::Region" + }, + ":", + { + Ref: "AWS::AccountId" + }, + ":log-group:/aws/kendra/*:log-stream:*" + ] + ] + } + } + ], + Version: "2012-10-17" + }, + PolicyName: "AllowLogging" + } + ], + }); +}); + +test('Launch Kendra index with custom properties', () => { + const testName = 'test-index-name'; + const stack = new Stack(undefined, undefined); + + buildKendraIndex(stack, 'test', { + kendraIndexProps: { + name: testName + } + }); + + const template = Template.fromStack(stack); + template.hasResourceProperties('AWS::Kendra::Index', { + Name: testName + }); + template.resourceCountIs("AWS::IAM::Role", 1); +}); + +test('Launch Kendra index with existing role', () => { + const fakeRoleArn = 'fake-arn'; + const stack = new Stack(undefined, undefined); + + buildKendraIndex(stack, 'test', { + kendraIndexProps: { + roleArn: fakeRoleArn + } + }); + + const template = Template.fromStack(stack); + template.hasResourceProperties('AWS::Kendra::Index', { + RoleArn: fakeRoleArn + }); + template.resourceCountIs("AWS::IAM::Role", 0); +}); + +test('use existing Kendra index', () => { + const stack = new Stack(undefined, undefined); + + const indexProps: kendra.CfnIndexProps = { + edition: 'DEVELOPER_EDITION', + name: 'kendra-test', + roleArn: 'fake-arn' + }; + + const testIndex = new kendra.CfnIndex(stack, `test`, indexProps); + + buildKendraIndex(stack, 'test', { + existingIndexObj: testIndex + }); + + const template = Template.fromStack(stack); + template.resourceCountIs('AWS::Kendra::Index', 1); +}); + +test('Launch Kendra index with an S3 data source', () => { + const testName = 'test-name'; + const testBucketName = 'test-bucket-name'; + const stack = new Stack(undefined, undefined); + + const newIndex = buildKendraIndex(stack, 'test', {}); + + AddKendraDataSource(stack, 'testSource', newIndex, { + type: 'S3', + name: testName, + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + }, + }); + + const template = Template.fromStack(stack); + template.resourceCountIs('AWS::Kendra::Index', 1); + template.resourceCountIs("AWS::Kendra::DataSource", 1); + template.resourceCountIs("AWS::IAM::Role", 2); + template.hasResourceProperties("AWS::Kendra::DataSource", { + Name: testName, + RoleArn: Match.anyValue(), + Type: 'S3', + DataSourceConfiguration: { + S3Configuration: { + BucketName: testBucketName + } + } + }); + template.hasResourceProperties("AWS::IAM::Role", { + AssumeRolePolicyDocument: { + Statement: [ + { + Action: "sts:AssumeRole", + Effect: "Allow", + Principal: { + Service: "kendra.amazonaws.com" + } + } + ], + Version: "2012-10-17" + }, + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Action: "s3:GetObject", + Effect: "Allow", + Resource: `arn:aws:s3:::${testBucketName}/*` + }, + { + Action: "s3:ListBucket", + Effect: "Allow", + Resource: `arn:aws:s3:::${testBucketName}` + }, + { + Action: [ + "kendra:BatchPutDocument", + "kendra:BatchDeleteDocument" + ], + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "kendraindextest", + "Arn" + ] + } + } + ], + Version: "2012-10-17" + }, + PolicyName: "s3CrawlPolicy" + } + ] + }); +}); + +test('Launch Kendra index with a customized S3 data source', () => { + const testName = 'test-name'; + const testBucketName = 'test-bucket-name'; + const stack = new Stack(undefined, undefined); + + const newIndex = buildKendraIndex(stack, 'test', {}); + + AddKendraDataSource(stack, 'testSource', newIndex, { + type: 'S3', + name: testName, + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + inclusionPatterns: ['IncludeThis'], + } + }, + }); + + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::Kendra::DataSource", { + DataSourceConfiguration: { + S3Configuration: { + BucketName: "test-bucket-name", + InclusionPatterns: ['IncludeThis'], + } + }, + }); + template.resourceCountIs('AWS::Kendra::Index', 1); + template.resourceCountIs("AWS::Kendra::DataSource", 1); + template.resourceCountIs("AWS::IAM::Role", 2); +}); + +test('Launch Kendra index with non-implemented data source', () => { + const nonImplementedSourceType = "WEBCRAWLER"; + const nonImplementedSourceName = "test-other-source"; + const stack = new Stack(undefined, undefined); + const testIndex = buildKendraIndex(stack, 'test', {}); + + // Create a role + const fakeRole = new iam.Role(stack, 'fakeRole', { + assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com'), + roleName: 'externalFakeRole' + }); + + // Create data source props + const dataSourceProps: Partial = { + name: nonImplementedSourceName, + roleArn: fakeRole.roleArn, + type: nonImplementedSourceType, + }; + + // Add a data source + AddKendraDataSource(stack, 'test-other-source', testIndex, dataSourceProps); + + const template = Template.fromStack(stack); + template.resourceCountIs('AWS::Kendra::Index', 1); + template.resourceCountIs('AWS::Kendra::DataSource', 1); + template.resourceCountIs('AWS::IAM::Role', 2); + template.hasResourceProperties("AWS::Kendra::DataSource", { + Name: nonImplementedSourceName, + Type: nonImplementedSourceType + }); +}); + +test('Confirm error if client supplies an index in the DataSource props', () => { + const nonImplementedSourceType = "WEBCRAWLER"; + const nonImplementedSourceName = "test-other-source"; + const stack = new Stack(undefined, undefined); + const testIndex = buildKendraIndex(stack, 'test', {}); + + // Create a role + const fakeRole = new iam.Role(stack, 'fakeRole', { + assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com'), + roleName: 'externalFakeRole' + }); + + // Create data source props + const dataSourceProps: Partial = { + name: nonImplementedSourceName, + roleArn: fakeRole.roleArn, + type: nonImplementedSourceType, + indexId: testIndex.attrId, + }; + + // Add a data source + const app = () => { + AddKendraDataSource(stack, 'test-other-source', testIndex, dataSourceProps); + }; + + expect(app).toThrowError(/Invalid DataSource prop specified - Construct must set the indexId prop/); +}); + +test('Confirm error if does not provide DataSource configuration', () => { + const stack = new Stack(undefined, undefined); + const testIndex = buildKendraIndex(stack, 'test', {}); + + // Create data source props + const dataSourceProps: Partial = { + type: "S3" + }; + + // Add a data source + const app = () => { + AddKendraDataSource(stack, 'test-bad-source', testIndex, dataSourceProps); + }; + + expect(app).toThrowError(/Error - an S3 Kendra DataSource requires an DataSourceCofiguration prop/); +}); + +test('Confirm error if does not provide S3 DataSource configuration', () => { + const stack = new Stack(undefined, undefined); + const testIndex = buildKendraIndex(stack, 'test', {}); + + // Create data source props + const dataSourceProps: Partial = { + type: "S3", + dataSourceConfiguration: { + + } + }; + + // Add a data source + const app = () => { + AddKendraDataSource(stack, 'test-bad-source', testIndex, dataSourceProps); + }; + + expect(app).toThrowError(/Error - an S3 Kendra DataSource requires an DataSourceCofiguration.S3Configuration prop/); +}); + +test('Confirm error if does not provide S3 Bucketname', () => { + const stack = new Stack(undefined, undefined); + const testIndex = buildKendraIndex(stack, 'test', {}); + + // Create data source props + const dataSourceProps: Partial = { + type: "S3", + dataSourceConfiguration: { + s3Configuration: { + // Going through some hoops here to force this conditiion, but since we + // allow | any for props, a client could do this + } as kendra.CfnDataSource.S3DataSourceConfigurationProperty + } + }; + + // Add a data source + const app = () => { + AddKendraDataSource(stack, 'test-bad-source', testIndex, dataSourceProps); + }; + + expect(app).toThrowError(/Error - an S3 Kendra DataSource requires the DataSourceCofiguration.S3Configuration.bucketName prop/); +}); + +test('Launch Kendra index with multiple data sources', () => { + const testName = 'test-name'; + const testBucketName = 'test-bucket-name'; + const nonImplementedSourceType = "WEBCRAWLER"; + const nonImplementedSourceName = "test-other-source"; + const stack = new Stack(undefined, undefined); + + const newIndex = buildKendraIndex(stack, 'test', {}); + + const s3DataSourceProps = { + type: 'S3', + name: testName, + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + }, + }; + + // Create a role + const fakeRole = new iam.Role(stack, 'fakeRole', { + assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com'), + roleName: 'externalFakeRole' + }); + + // Create data source props + const otherDataSourceProps: Partial = { + name: nonImplementedSourceName, + roleArn: fakeRole.roleArn, + type: nonImplementedSourceType + }; + + // Add a data source + const sourceObjects = AddMultipleKendraDataSources(stack, 'test-other-source', newIndex, [ + s3DataSourceProps, + otherDataSourceProps + ] + ); + + expect(sourceObjects.length).toEqual(2); + expect(sourceObjects[0].type).toEqual('S3'); + expect(sourceObjects[1].name).toEqual(nonImplementedSourceName); + + const template = Template.fromStack(stack); + template.resourceCountIs('AWS::Kendra::Index', 1); + template.resourceCountIs('AWS::Kendra::DataSource', 2); + template.resourceCountIs('AWS::IAM::Role', 3); + + // Look for S3 data source + template.hasResourceProperties("AWS::Kendra::DataSource", { + Name: testName, + RoleArn: Match.anyValue(), + Type: 'S3', + DataSourceConfiguration: { + S3Configuration: { + BucketName: testBucketName + } + } + }); + template.hasResourceProperties("AWS::IAM::Role", { + AssumeRolePolicyDocument: { + Statement: [ + { + Action: "sts:AssumeRole", + Effect: "Allow", + Principal: { + Service: "kendra.amazonaws.com" + } + } + ], + Version: "2012-10-17" + }, + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Action: "s3:GetObject", + Effect: "Allow", + Resource: `arn:aws:s3:::${testBucketName}/*` + }, + { + Action: "s3:ListBucket", + Effect: "Allow", + Resource: `arn:aws:s3:::${testBucketName}` + }, + { + Action: [ + "kendra:BatchPutDocument", + "kendra:BatchDeleteDocument" + ], + Effect: "Allow", + Resource: { + "Fn::GetAtt": [ + "kendraindextest", + "Arn" + ] + } + } + ], + Version: "2012-10-17" + }, + PolicyName: "s3CrawlPolicy" + } + ] + }); + + // Look for non-implemented data source + template.hasResourceProperties("AWS::Kendra::DataSource", { + Name: nonImplementedSourceName, + Type: nonImplementedSourceType, + IndexId: Match.anyValue() + }); + +}); + +test('Confirm Errof for bad kendra Permission in normalizeKendraPermissions()', () => { + const inputs = ["read", "submitfeedback", "write"]; + + const outputs = normalizeKendraPermissions(inputs); + + expect(outputs.includes("READ")).toBeTruthy(); + expect(outputs.includes("SUBMITFEEDBACK")).toBeTruthy(); + expect(outputs.includes("WRITE")).toBeTruthy(); +}); + +test('Confirm successful operation of normalizeKendraPermissions()', () => { + const inputs = ["badvalue", "write"]; + + const app = () => { + normalizeKendraPermissions(inputs); + }; + + expect(app).toThrowError(/Invalid indexPermission value - valid values are "READ", "SUBMITFEEDBACK" and "WRITE"/); +}); \ No newline at end of file diff --git a/source/tools/cdk-integ-tools/package.json b/source/tools/cdk-integ-tools/package.json index b621fb506..25e932120 100644 --- a/source/tools/cdk-integ-tools/package.json +++ b/source/tools/cdk-integ-tools/package.json @@ -11,7 +11,7 @@ }, "bin": { "cdk-integ": "bin/cdk-integ", - "cdk-integ-assert": "bin/cdk-integ-assert", + "cdk-integ-assert-v2": "bin/cdk-integ-assert", "cdk-integ-assert-v2": "bin/cdk-integ-assert-v2" }, "scripts": { diff --git a/source/use_cases/aws-custom-glue-etl/package.json b/source/use_cases/aws-custom-glue-etl/package.json index 5c5109f21..bf7d3c0df 100644 --- a/source/use_cases/aws-custom-glue-etl/package.json +++ b/source/use_cases/aws-custom-glue-etl/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "build+lint+test": "npm run build && npm run lint && npm test && npm run integ-assert" }, "dependencies": { diff --git a/source/use_cases/aws-restaurant-management-demo/package.json b/source/use_cases/aws-restaurant-management-demo/package.json index 97dd93028..fbfc26b9c 100644 --- a/source/use_cases/aws-restaurant-management-demo/package.json +++ b/source/use_cases/aws-restaurant-management-demo/package.json @@ -25,7 +25,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "build+lint+test": "npm run build && npm run lint && npm test && npm run integ-assert" }, "devDependencies": { diff --git a/source/use_cases/aws-s3-static-website/package.json b/source/use_cases/aws-s3-static-website/package.json index 8f039306f..b529176ee 100644 --- a/source/use_cases/aws-s3-static-website/package.json +++ b/source/use_cases/aws-s3-static-website/package.json @@ -24,7 +24,7 @@ "watch": "tsc -b -w", "integ": "cdk-integ", "integ-no-clean": "cdk-integ --no-clean", - "integ-assert": "cdk-integ-assert", + "integ-assert": "cdk-integ-assert-v2", "build+lint+test": "npm run build && npm run lint && npm test && npm run integ-assert" }, "dependencies": { From d74e71860319b9b1dbf324763b3b9019814c55b3 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Mon, 28 Aug 2023 17:27:37 +0000 Subject: [PATCH 33/73] chore(release): 2.43.0 --- CHANGELOG.md | 8 ++++++++ source/lerna.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75337c745..9963554ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.43.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.42.0...v2.43.0) (2023-08-28) + + +### Features + +* **aws-openapi-lambda:** make names unique ([#987](https://github.com/awslabs/aws-solutions-constructs/issues/987)) ([be9997a](https://github.com/awslabs/aws-solutions-constructs/commit/be9997a4e7e376670ef7f3d8bf1335ea3cebc515)) +* **new construct:** aws-lambda-kendra ([#989](https://github.com/awslabs/aws-solutions-constructs/issues/989)) ([24fe018](https://github.com/awslabs/aws-solutions-constructs/commit/24fe018898dafd4be2d20d6636ad54333da4145d)) + ## [2.42.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.41.0...v2.42.0) (2023-08-12) Build on CDK v2.82.0 diff --git a/source/lerna.json b/source/lerna.json index 25990f311..a0b81d651 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.42.0" + "version": "2.43.0" } From d6bd79cbbd3a62f4cd5192eaf838bf9b1963edb7 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Mon, 28 Aug 2023 13:33:06 -0400 Subject: [PATCH 34/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9963554ba..737d3d585 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. See [standa ## [2.43.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.42.0...v2.43.0) (2023-08-28) +Build on CDK v2.82.0 + +### Bug Fixes + +* **aws-kinesisfirehose-s3:** resource name collision when two instances deployed in same stack ([#991](https://github.com/awslabs/aws-solutions-constructs/pull/991)) ### Features From 7ab57ecd507e336b7b76da2d60ac949551c89d52 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Mon, 28 Aug 2023 19:46:03 -0400 Subject: [PATCH 35/73] Remove extra package.json contents --- .../aws-lambda-kendra/package.json | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json index ed75cea81..2a45b3ef0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json @@ -84,13 +84,5 @@ "AWS Solutions Constructs", "Amazon Kendra", "AWS Lambda" - ], - "bugs": { - "url": "https://github.com/awslabs/aws-solutions-constructs/issues" - }, - "homepage": "https://github.com/awslabs/aws-solutions-constructs#readme", - "directories": { - "lib": "lib", - "test": "test" - } + ] } \ No newline at end of file From 8616451dc71378ebf7792339f582ceb14c5868e9 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Mon, 28 Aug 2023 20:03:02 -0400 Subject: [PATCH 36/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 737d3d585..50e9e196b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.43.1](https://github.com/awslabs/aws-solutions-constructs/compare/v2.43.0...v2.43.1) (2023-08-28) + +Build on CDK v2.82.0 + +### Bug Fixes + +* **aws-lambda-kendra:** remove extra info from bottom of package.json + ## [2.43.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.42.0...v2.43.0) (2023-08-28) Build on CDK v2.82.0 From c741d85cdd9975384abb2daaa8af4e42044c901b Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 28 Aug 2023 21:15:18 -0400 Subject: [PATCH 37/73] chore(release): 2.43.1 (#995) (#996) * Remove extra package.json contents * chore(release): 2.43.1 --------- Co-authored-by: AWS Solutions Constructs Team <67720492+aws-solutions-constructs-team@users.noreply.github.com> --- source/lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/lerna.json b/source/lerna.json index a0b81d651..77195755e 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.43.0" + "version": "2.43.1" } From f7cab76952261ad526540bec65534498d6097850 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 28 Aug 2023 22:25:40 -0400 Subject: [PATCH 38/73] Correct errors preventing PyPi publication (#997) --- CHANGELOG.md | 4 ++++ .../@aws-solutions-constructs/aws-lambda-kendra/package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50e9e196b..e0c9cc39f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. See [standa ## [2.43.1](https://github.com/awslabs/aws-solutions-constructs/compare/v2.43.0...v2.43.1) (2023-08-28) +BUG NOTICE - THIS RELEASE WAS ONLY PARTIALLY PUBLISHED in PYPI, USE 2.44.0 + Build on CDK v2.82.0 ### Bug Fixes @@ -12,6 +14,8 @@ Build on CDK v2.82.0 ## [2.43.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.42.0...v2.43.0) (2023-08-28) +BUG NOTICE - THIS RELEASE WAS ONLY PARTIALLY PUBLISHED in PYPI, USE 2.44.0 + Build on CDK v2.82.0 ### Bug Fixes diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json index 2a45b3ef0..a5d16ad28 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json @@ -6,7 +6,7 @@ "types": "lib/index.d.ts", "repository": { "type": "git", - "url": "git+https://github.com/awslabs/aws-solutions-constructs.git", + "url": "https://github.com/awslabs/aws-solutions-constructs.git", "directory": "source/patterns/@aws-solutions-constructs/aws-lambda-kendra" }, "author": "Amazon Web Services (https://aws.amazon.com)", From b385bafd57b676e65c1ffadce6e2a11fb0b92199 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Tue, 29 Aug 2023 02:29:15 +0000 Subject: [PATCH 39/73] chore(release): 2.44.0 --- CHANGELOG.md | 2 ++ source/lerna.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0c9cc39f..30662fc01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.44.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.43.0...v2.44.0) (2023-08-29) + ## [2.43.1](https://github.com/awslabs/aws-solutions-constructs/compare/v2.43.0...v2.43.1) (2023-08-28) BUG NOTICE - THIS RELEASE WAS ONLY PARTIALLY PUBLISHED in PYPI, USE 2.44.0 diff --git a/source/lerna.json b/source/lerna.json index 77195755e..d345e11d4 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.43.1" + "version": "2.44.0" } From a8f8ae0b63db186b5f7db1f68daf3407596efc04 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Mon, 28 Aug 2023 22:32:35 -0400 Subject: [PATCH 40/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30662fc01..3d7e89f3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,17 @@ All notable changes to this project will be documented in this file. See [standa ## [2.44.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.43.0...v2.44.0) (2023-08-29) +Built on CDK v2.82.0 (no new features, just internal housekeeping) + +### Bug Fixes + +* **aws-lambda-kendra:** fixed package.json issues + ## [2.43.1](https://github.com/awslabs/aws-solutions-constructs/compare/v2.43.0...v2.43.1) (2023-08-28) BUG NOTICE - THIS RELEASE WAS ONLY PARTIALLY PUBLISHED in PYPI, USE 2.44.0 -Build on CDK v2.82.0 +Built on CDK v2.82.0 ### Bug Fixes @@ -18,7 +24,7 @@ Build on CDK v2.82.0 BUG NOTICE - THIS RELEASE WAS ONLY PARTIALLY PUBLISHED in PYPI, USE 2.44.0 -Build on CDK v2.82.0 +Built on CDK v2.82.0 ### Bug Fixes @@ -39,7 +45,7 @@ Build on CDK v2.82.0 ## [2.41.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.40.0...v2.41.0) (2023-06-06) -Build on CDK v2.82.0 +Built on CDK v2.82.0 ## [2.40.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.39.0...v2.40.0) (2023-06-03) From e4b5ce054dc1679d91f1ff7696625448821cff8c Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Wed, 30 Aug 2023 14:22:46 -0400 Subject: [PATCH 41/73] Remove use of npm-bin (#1001) --- deployment/v2/build-patterns.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v2/build-patterns.sh b/deployment/v2/build-patterns.sh index 3e35cb875..ca3b2e65d 100755 --- a/deployment/v2/build-patterns.sh +++ b/deployment/v2/build-patterns.sh @@ -12,7 +12,7 @@ bail="--bail" runtarget="build+lint+test" cd $source_dir/ -export PATH=$(npm bin):$PATH +export PATH=$source_dir/node_modules/.bin:$PATH export NODE_OPTIONS="--max-old-space-size=4096 ${NODE_OPTIONS:-}" echo "=============================================================================================" From 2ee69878b1ec459c7c546f9a73af41aa10ff290c Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Fri, 8 Sep 2023 10:16:11 -0400 Subject: [PATCH 42/73] Address Sonarqube issues (#1003) --- .../aws-apigateway-dynamodb/lib/index.ts | 84 +++++++++++++++---- .../test/lambda-elasticsearch-kibana.test.ts | 19 +++++ .../test/lambda-opensearch.test.ts | 19 +++++ .../aws-wafwebacl-alb/lib/index.ts | 3 +- .../core/lib/alb-helper.ts | 3 + .../core/lib/elasticsearch-helper.ts | 5 +- .../core/lib/kendra-helper.ts | 4 +- .../core/lib/opensearch-helper.ts | 5 +- .../core/lib/s3-bucket-helper.ts | 38 ++++++++- .../core/lib/sagemaker-helper.ts | 6 +- .../core/lib/sns-helper.ts | 5 +- .../core/lib/sqs-helper.ts | 6 +- .../core/test/sagemaker-helper.test.ts | 21 +++++ 13 files changed, 195 insertions(+), 23 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts index 05724b22d..4fcd666a5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts @@ -205,23 +205,19 @@ export class ApiGatewayToDynamoDB extends Construct { super(scope, id); defaults.CheckProps(props); - if ((props.createRequestTemplate || props.additionalCreateRequestTemplates || props.createIntegrationResponses) - && props.allowCreateOperation !== true) { + if (this.CheckCreateRequestProps(props)) { throw new Error(`The 'allowCreateOperation' property must be set to true when setting any of the following: ` + `'createRequestTemplate', 'additionalCreateRequestTemplates', 'createIntegrationResponses'`); } - if ((props.readRequestTemplate || props.additionalReadRequestTemplates || props.readIntegrationResponses) - && props.allowReadOperation === false) { + if (this.CheckReadRequestProps(props)) { throw new Error(`The 'allowReadOperation' property must be set to true or undefined when setting any of the following: ` + `'readRequestTemplate', 'additionalReadRequestTemplates', 'readIntegrationResponses'`); } - if ((props.updateRequestTemplate || props.additionalUpdateRequestTemplates || props.updateIntegrationResponses) - && props.allowUpdateOperation !== true) { + if (this.CheckUpdateRequestProps(props)) { throw new Error(`The 'allowUpdateOperation' property must be set to true when setting any of the following: ` + `'updateRequestTemplate', 'additionalUpdateRequestTemplates', 'updateIntegrationResponses'`); } - if ((props.deleteRequestTemplate || props.additionalDeleteRequestTemplates || props.deleteIntegrationResponses) - && props.allowDeleteOperation !== true) { + if (this.CheckDeleteRequestProps(props)) { throw new Error(`The 'allowDeleteOperation' property must be set to true when setting any of the following: ` + `'deleteRequestTemplate', 'additionalDeleteRequestTemplates', 'deleteIntegrationResponses'`); } @@ -261,8 +257,9 @@ export class ApiGatewayToDynamoDB extends Construct { // Setup API Gateway Method // Create - if (props.allowCreateOperation && props.allowCreateOperation === true && props.createRequestTemplate) { - const createRequestTemplate = props.createRequestTemplate.replace("${Table}", this.dynamoTable.tableName); + if (this.ImplementCreateOperation(props)) { + // ImplementCreateOperation has confirmed that createRequestTemplate exists) + const createRequestTemplate = props.createRequestTemplate!.replace("${Table}", this.dynamoTable.tableName); this.addActionToPolicy("dynamodb:PutItem"); defaults.addProxyMethodToApiResource({ service: "dynamodb", @@ -276,7 +273,7 @@ export class ApiGatewayToDynamoDB extends Construct { }); } // Read - if (props.allowReadOperation === undefined || props.allowReadOperation === true) { + if (this.ImplementReaOperation(props)) { const readRequestTemplate = props.readRequestTemplate ?? `{ \ "TableName": "${this.dynamoTable.tableName}", \ @@ -301,8 +298,9 @@ export class ApiGatewayToDynamoDB extends Construct { }); } // Update - if (props.allowUpdateOperation && props.allowUpdateOperation === true && props.updateRequestTemplate) { - const updateRequestTemplate = props.updateRequestTemplate.replace("${Table}", this.dynamoTable.tableName); + if (this.ImplementUpdateOperation(props)) { + // ImplementUpdateOperation confirmed the existence of updateRequestTemplate + const updateRequestTemplate = props.updateRequestTemplate!.replace("${Table}", this.dynamoTable.tableName); this.addActionToPolicy("dynamodb:UpdateItem"); defaults.addProxyMethodToApiResource({ service: "dynamodb", @@ -316,7 +314,7 @@ export class ApiGatewayToDynamoDB extends Construct { }); } // Delete - if (props.allowDeleteOperation && props.allowDeleteOperation === true) { + if (this.ImplementDeleteOperation(props)) { const deleteRequestTemplate = props.deleteRequestTemplate ?? `{ \ "TableName": "${this.dynamoTable.tableName}", \ @@ -342,6 +340,64 @@ export class ApiGatewayToDynamoDB extends Construct { } } + private CheckReadRequestProps(props: ApiGatewayToDynamoDBProps): boolean { + if ((props.readRequestTemplate || props.additionalReadRequestTemplates || props.readIntegrationResponses) + && props.allowReadOperation === false) { + return true; + } + return false; + } + private CheckUpdateRequestProps(props: ApiGatewayToDynamoDBProps): boolean { + if ((props.updateRequestTemplate || props.additionalUpdateRequestTemplates || props.updateIntegrationResponses) + && props.allowUpdateOperation !== true) { + return true; + } + return false; + } + private CheckDeleteRequestProps(props: ApiGatewayToDynamoDBProps): boolean { + if ((props.deleteRequestTemplate || props.additionalDeleteRequestTemplates || props.deleteIntegrationResponses) + && props.allowDeleteOperation !== true) { + return true; + } + return false; + } + + private CheckCreateRequestProps(props: ApiGatewayToDynamoDBProps): boolean { + if ((props.createRequestTemplate || props.additionalCreateRequestTemplates || props.createIntegrationResponses) + && props.allowCreateOperation !== true) { + return true; + } + return false; + } + + private ImplementCreateOperation(props: ApiGatewayToDynamoDBProps): boolean { + if (props.allowCreateOperation && props.allowCreateOperation === true && props.createRequestTemplate) { + return true; + } + return false; + } + + private ImplementReaOperation(props: ApiGatewayToDynamoDBProps): boolean { + if (props.allowReadOperation === undefined || props.allowReadOperation === true) { + return true; + } + return false; + } + + private ImplementUpdateOperation(props: ApiGatewayToDynamoDBProps): boolean { + if (props.allowUpdateOperation && props.allowUpdateOperation === true && props.updateRequestTemplate) { + return true; + } + return false; + } + + private ImplementDeleteOperation(props: ApiGatewayToDynamoDBProps): boolean { + if (props.allowDeleteOperation && props.allowDeleteOperation === true) { + return true; + } + return false; + } + private addActionToPolicy(action: string) { this.apiGatewayRole.addToPolicy(new iam.PolicyStatement({ resources: [ diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts index 59452bd7d..94ea22461 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts @@ -93,6 +93,25 @@ test('check properties with no CW Alarms ', () => { expect(construct.elasticsearchRole).toBeDefined(); }); +test('Check that TLS 1.2 is the default', () => { + const stack = new cdk.Stack(); + + const props: LambdaToElasticSearchAndKibanaProps = { + lambdaFunctionProps: getDefaultTestLambdaProps(), + domainName: 'test-domain', + createCloudWatchAlarms: false + }; + + new LambdaToElasticSearchAndKibana(stack, 'test-lambda-opensearch-stack', props); + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::Elasticsearch::Domain", { + DomainEndpointOptions: { + EnforceHTTPS: true, + TLSSecurityPolicy: "Policy-Min-TLS-1-2-2019-07" + }, + }); +}); + test('check lambda function custom environment variable', () => { const stack = new cdk.Stack(); const props: LambdaToElasticSearchAndKibanaProps = { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts index a3620631e..47013d07c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts @@ -69,6 +69,25 @@ test('Check properties with no CloudWatch alarms ', () => { expect(construct.openSearchRole).toBeDefined(); }); +test('Check that TLS 1.2 is the default', () => { + const stack = new cdk.Stack(); + + const props: LambdaToOpenSearchProps = { + lambdaFunctionProps: getDefaultTestLambdaProps(), + openSearchDomainName: 'test-domain', + createCloudWatchAlarms: false + }; + + new LambdaToOpenSearch(stack, 'test-lambda-opensearch-stack', props); + const template = Template.fromStack(stack); + template.hasResourceProperties("AWS::OpenSearchService::Domain", { + DomainEndpointOptions: { + EnforceHTTPS: true, + TLSSecurityPolicy: "Policy-Min-TLS-1-2-2019-07" + }, + }); +}); + test('Check for an existing Lambda object', () => { const stack = new cdk.Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts index 55d74c8d1..d37c75e8b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts @@ -67,7 +67,8 @@ export class WafwebaclToAlb extends Construct { }; // Setup the Web ACL Association - new waf.CfnWebACLAssociation(scope, `${id}-WebACLAssociation`, aclProps); + // Before turning off SonarQube for the line, reduce the line to it's minimum + new waf.CfnWebACLAssociation(scope, `${id}-WebACLAssociation`, aclProps); // NOSONAR this.loadBalancer = props.existingLoadBalancerObj; } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts index 8441bd6b5..34f8b8a03 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts @@ -112,6 +112,9 @@ export function AddListener( protocol: "HTTPS", }; + // NOSONAR: (typescript:S5332) + // This listener is explicitly created to redirect non TLS connections + // The lack of SSL/TLS is intentional const httpListener = new elb.ApplicationListener( scope, `${id}-redirect`, diff --git a/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-helper.ts index 73e8d2a02..be82d4981 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/elasticsearch-helper.ts @@ -83,7 +83,10 @@ export function buildElasticSearch(scope: Construct, props: BuildElasticSearchPr const defaultCfnDomainProps = DefaultCfnDomainProps(props.domainName, cognitoKibanaConfigureRole, props); const finalCfnDomainProps = consolidateProps(defaultCfnDomainProps, props.clientDomainProps, constructDrivenProps); - const esDomain = new elasticsearch.CfnDomain(scope, `ElasticsearchDomain`, finalCfnDomainProps); + // tlsSecurityPolicy is set in DefaultCfnDomainProps() - it is the + // default behavior, but Sonarqube cannot follow the program flow to confirm this. + // This is confirmed by the 'Check that TLS 1.2 is the default' test in aws-lambda-elasticsearch + const esDomain = new elasticsearch.CfnDomain(scope, `ElasticsearchDomain`, finalCfnDomainProps); // NOSONAR addCfnSuppressRules(esDomain, [ { diff --git a/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts index 0b88b9edc..65d94c116 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts @@ -18,13 +18,13 @@ import * as kendra from 'aws-cdk-lib/aws-kendra'; import * as iam from 'aws-cdk-lib/aws-iam'; -import { addCfnSuppressRules, consolidateProps } from "./utils"; +import { addCfnSuppressRules, consolidateProps, generatePhysicalName, overrideProps } from "./utils"; import { Aws } from 'aws-cdk-lib'; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate import { Construct } from 'constructs'; import { DefaultKendraIndexProps } from './kendra-defaults'; -import { generatePhysicalName, overrideProps } from "./utils"; +import { } from "./utils"; export interface BuildKendraIndexProps { readonly kendraIndexProps?: kendra.CfnIndexProps | any; diff --git a/source/patterns/@aws-solutions-constructs/core/lib/opensearch-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/opensearch-helper.ts index b3844204f..7393177e3 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/opensearch-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/opensearch-helper.ts @@ -82,7 +82,10 @@ export function buildOpenSearch(scope: Construct, props: BuildOpenSearchProps): const defaultCfnDomainProps = DefaultOpenSearchCfnDomainProps(props.openSearchDomainName, cognitoDashboardConfigureRole, props); const finalCfnDomainProps = consolidateProps(defaultCfnDomainProps, props.clientDomainProps, constructDrivenProps); - const opensearchDomain = new opensearch.CfnDomain(scope, `OpenSearchDomain`, finalCfnDomainProps); + // tlsSecurityPolicy is set in DefaultOpenSearchCfnDomainProps() - it is the + // default behavior, but Sonarqube cannot follow the program flow to confirm this. + // This is confirmed by the 'Check that TLS 1.2 is the default' test in aws-lambda-opensearch + const opensearchDomain = new opensearch.CfnDomain(scope, `OpenSearchDomain`, finalCfnDomainProps); // NOSONAR addCfnSuppressRules(opensearchDomain, [ { diff --git a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts index 7bcf603cf..5149aa76f 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts @@ -61,7 +61,19 @@ export function createLoggingBucket(scope: Construct, const combinedBucketProps = consolidateProps(DefaultS3Props(), loggingBucketProps); // Create the Logging Bucket - const loggingBucket: s3.Bucket = new s3.Bucket(scope, bucketId, combinedBucketProps); + // NOSONAR (typescript:S6281) + // Block Public Access is set by DefaultS3Props, but Sonarqube can't detect it + // It is verified by 's3 bucket with default props' in the unit tests + // NOSONAR (typescript:S6245) + // Encryption is turned on in the default properties that Sonarqube doesn't see + // Verified by unit test 's3 bucket with default props' + // NOSONAR (typescript:S6249) + // enforceSSL is turned on in the default properties that Sonarqube doesn't see + // Verified by unit test 's3 bucket with default props' + // NOSONAR (typescript:typescript:S6249) + // versioning is turned on in the default properties that Sonarqube doesn't see + // Verified by unit test 's3 bucket with default props' + const loggingBucket: s3.Bucket = new s3.Bucket(scope, bucketId, combinedBucketProps); // NOSONAR // Extract the CfnBucket from the loggingBucket const loggingBucketResource = loggingBucket.node.findChild('Resource') as s3.CfnBucket; @@ -94,6 +106,18 @@ export function createAlbLoggingBucket(scope: Construct, const combinedBucketProps = consolidateProps(DefaultS3Props(), loggingBucketProps); // Create the Logging Bucket + // NOSONAR (typescript:S6281) + // Block Public Access is set by DefaultS3Props, but Sonarqube can't detect it + // It is verified by 's3 bucket with default props' in the unit tests + // NOSONAR (typescript:S6245) + // Encryption is turned on in the default properties that Sonarqube doesn't see + // Verified by unit test 's3 bucket with default props' + // NOSONAR (typescript:S6249) + // enforceSSL is turned on in the default properties that Sonarqube doesn't see + // Verified by unit test 's3 bucket with default props' + // NOSONAR (typescript:typescript:S6249) + // versioning is turned on in the default properties that Sonarqube doesn't see + // Verified by unit test 's3 bucket with default props' const loggingBucket: s3.Bucket = new s3.Bucket(scope, bucketId, combinedBucketProps); // Extract the CfnBucket from the loggingBucket @@ -163,6 +187,18 @@ export function buildS3Bucket(scope: Construct, const combinedBucketProps = consolidateProps(defaultBucketProps, props.bucketProps); + // NOSONAR (typescript:S6281) - Block Public Access is set by DefaultS3Props, + // but Sonarqube can't detect it + // It is verified by 's3 bucket with default props' in the unit tests + // NOSONAR (typescript:S6245) + // Encryption is turned on in the default properties that Sonarqube doesn't see + // Verified by unit test 's3 bucket with default props' + // NOSONAR (typescript:S6249) + // enforceSSL is turned on in the default properties that Sonarqube doesn't see + // Verified by unit test 's3 bucket with default props' + // NOSONAR (typescript:typescript:S6249) + // versioning is turned on in the default properties that Sonarqube doesn't see + // Verified by unit test 's3 bucket with default props' const s3Bucket: s3.Bucket = new s3.Bucket(scope, resolvedBucketId, combinedBucketProps ); return { bucket: s3Bucket, loggingBucket }; diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts index 9ea8f7786..58f48d381 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts @@ -295,11 +295,15 @@ export function buildSagemakerNotebook( sagemakerNotebookProps = consolidateProps(sagemakerNotebookProps, props.sagemakerNotebookProps); // Create the notebook + // NOSONAR: (typescript:S6319) + // keyID is created above in the if (props.sagemakerNotebookProps?.kmsKeyId === undefined) + // block. It is then passed to DefaultSagemakerNotebookProps() + // This behavior is validated in unit test const sagemakerInstance: sagemaker.CfnNotebookInstance = new sagemaker.CfnNotebookInstance( scope, 'SagemakerNotebook', sagemakerNotebookProps - ); + ); // NOSONAR if (vpcInstance) { return { notebook: sagemakerInstance, vpc: vpcInstance, securityGroup }; } else { diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sns-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sns-helper.ts index 5e0c61beb..883a82b92 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sns-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sns-helper.ts @@ -160,7 +160,10 @@ export function buildTopic(scope: Construct, props: BuildTopicProps): BuildTopic } // Create the SNS Topic - const topic: sns.Topic = new sns.Topic(scope, 'SnsTopic', snsTopicProps); + // NOSONAR (typescript:S6327) - The masterKey is set in the if statement above, SONAR is + // not catching it. Behavior is confirmed in the + // 'Test deployment with no properties using AWS Managed KMS Key' unit test + const topic: sns.Topic = new sns.Topic(scope, 'SnsTopic', snsTopicProps); // NOSONAR applySecureTopicPolicy(topic); diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts index bd49f1214..15fcec8c7 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts @@ -111,7 +111,11 @@ export function buildQueue(scope: Construct, id: string, props: BuildQueueProps) queueProps.encryptionMasterKey = buildEncryptionKey(scope, props.encryptionKeyProps); } - const queue = new sqs.Queue(scope, id, queueProps); + // NOSONAR (typescript:S6330) + // encryption is set to QueueEncryption.KMS_MANAGED by default in DefaultQueueProps, but + // Sonarqube can't parse the code well enough to see this. Encryption is confirmed by + // the 'Test deployment without imported encryption key' unit test + const queue = new sqs.Queue(scope, id, queueProps); // NOSONAR applySecureQueuePolicy(queue); diff --git a/source/patterns/@aws-solutions-constructs/core/test/sagemaker-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/sagemaker-helper.test.ts index ac6e09bc8..a13347c82 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/sagemaker-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/sagemaker-helper.test.ts @@ -81,6 +81,27 @@ test('Test deployment w/ existing VPC', () => { }); }); +test('Test default values encrypt notebook', () => { + // Stack + const stack = new Stack(); + const sagemakerRole = new iam.Role(stack, 'SagemakerRole', { + assumedBy: new iam.ServicePrincipal('sagemaker.amazonaws.com'), + }); + + // Build Sagemaker Notebook Instance + defaults.buildSagemakerNotebook(stack, { + role: sagemakerRole, + deployInsideVpc: false, + }); + // Assertion + const template = Template.fromStack(stack); + template.hasResourceProperties('AWS::SageMaker::NotebookInstance', { + KmsKeyId: { + Ref: "EncryptionKey1B843E66" + }, + }); +}); + test('Test deployment w/ override', () => { // Stack const stack = new Stack(); From 88ef6796e40d561652c3b09b08be5f1dddb367d7 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Sat, 9 Sep 2023 10:25:55 -0400 Subject: [PATCH 43/73] Update Code Smell omissions (#1004) Only changes are moved/added comment lines to satisfy build tools --- .../patterns/@aws-solutions-constructs/core/lib/alb-helper.ts | 2 +- .../@aws-solutions-constructs/core/lib/s3-bucket-helper.ts | 4 ++-- .../@aws-solutions-constructs/core/lib/sagemaker-helper.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts index 34f8b8a03..8887608c6 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts @@ -120,7 +120,7 @@ export function AddListener( `${id}-redirect`, { loadBalancer, - protocol: ApplicationProtocol.HTTP, + protocol: ApplicationProtocol.HTTP, // NOSONAR defaultAction: ListenerAction.redirect(opt), } ); diff --git a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts index 5149aa76f..799ebe876 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts @@ -118,7 +118,7 @@ export function createAlbLoggingBucket(scope: Construct, // NOSONAR (typescript:typescript:S6249) // versioning is turned on in the default properties that Sonarqube doesn't see // Verified by unit test 's3 bucket with default props' - const loggingBucket: s3.Bucket = new s3.Bucket(scope, bucketId, combinedBucketProps); + const loggingBucket: s3.Bucket = new s3.Bucket(scope, bucketId, combinedBucketProps); // NOSONAR // Extract the CfnBucket from the loggingBucket const loggingBucketResource = loggingBucket.node.findChild('Resource') as s3.CfnBucket; @@ -199,7 +199,7 @@ export function buildS3Bucket(scope: Construct, // NOSONAR (typescript:typescript:S6249) // versioning is turned on in the default properties that Sonarqube doesn't see // Verified by unit test 's3 bucket with default props' - const s3Bucket: s3.Bucket = new s3.Bucket(scope, resolvedBucketId, combinedBucketProps ); + const s3Bucket: s3.Bucket = new s3.Bucket(scope, resolvedBucketId, combinedBucketProps ); // NOSONAR return { bucket: s3Bucket, loggingBucket }; } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts index 58f48d381..654cbe9b2 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts @@ -302,8 +302,8 @@ export function buildSagemakerNotebook( const sagemakerInstance: sagemaker.CfnNotebookInstance = new sagemaker.CfnNotebookInstance( scope, 'SagemakerNotebook', - sagemakerNotebookProps - ); // NOSONAR + sagemakerNotebookProps // NOSONAR + ); if (vpcInstance) { return { notebook: sagemakerInstance, vpc: vpcInstance, securityGroup }; } else { From aae378169f89b4ddd44f2b9d8e65850aaaf57e79 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 11 Sep 2023 12:25:01 -0400 Subject: [PATCH 44/73] chore(sonarqube): address more code smells (#1005) * Clean Up Code Smells - isolate service prop tests * Added 2 missing constructs to Sonarqube coverage --- sonar-project.properties | 2 + .../aws-apigateway-sqs/lib/index.ts | 31 ++++-- .../aws-fargate-s3/lib/index.ts | 8 +- .../aws-kinesisstreams-gluejob/lib/index.ts | 27 +----- .../test/lambda-kendra.test.ts | 2 +- .../core/lib/input-validation.ts | 64 ++++++++++--- .../core/test/glue-job-helper.test.ts | 68 +------------ .../core/test/input-validation.test.ts | 95 ++++++++++++++++--- 8 files changed, 169 insertions(+), 128 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index 63bdcdbdb..f6b2fc410 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -69,6 +69,7 @@ sonar.javascript.lcov.reportPaths= \ source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/coverage/lcov.info, \ + source/patterns/@aws-solutions-constructs/aws-lambda-kendra/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/coverage/lcov.info, \ @@ -80,6 +81,7 @@ sonar.javascript.lcov.reportPaths= \ source/patterns/@aws-solutions-constructs/aws-lambda-sqs/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/coverage/lcov.info, \ + source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-route53-alb/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-route53-apigateway/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-s3-lambda/coverage/lcov.info, \ diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts index 1b4d00221..7503879c9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts @@ -198,18 +198,15 @@ export class ApiGatewayToSqs extends Construct { super(scope, id); defaults.CheckProps(props); - if ((props.createRequestTemplate || props.additionalCreateRequestTemplates || props.createIntegrationResponses) - && props.allowCreateOperation !== true) { + if (this.CheckCreateRequestProps(props)) { throw new Error(`The 'allowCreateOperation' property must be set to true when setting any of the following: ` + `'createRequestTemplate', 'additionalCreateRequestTemplates', 'createIntegrationResponses'`); } - if ((props.readRequestTemplate || props.additionalReadRequestTemplates || props.readIntegrationResponses) - && props.allowReadOperation === false) { + if (this.CheckReadRequestProps(props)) { throw new Error(`The 'allowReadOperation' property must be set to true or undefined when setting any of the following: ` + `'readRequestTemplate', 'additionalReadRequestTemplates', 'readIntegrationResponses'`); } - if ((props.deleteRequestTemplate || props.additionalDeleteRequestTemplates || props.deleteIntegrationResponses) - && props.allowDeleteOperation !== true) { + if (this.CheckDeleteRequestProps(props)) { throw new Error(`The 'allowDeleteOperation' property must be set to true when setting any of the following: ` + `'deleteRequestTemplate', 'additionalDeleteRequestTemplates', 'deleteIntegrationResponses'`); } @@ -298,6 +295,28 @@ export class ApiGatewayToSqs extends Construct { }); } } + private CheckReadRequestProps(props: ApiGatewayToSqsProps): boolean { + if ((props.readRequestTemplate || props.additionalReadRequestTemplates || props.readIntegrationResponses) + && props.allowReadOperation === false) { + return true; + } + return false; + } + private CheckDeleteRequestProps(props: ApiGatewayToSqsProps): boolean { + if ((props.deleteRequestTemplate || props.additionalDeleteRequestTemplates || props.deleteIntegrationResponses) + && props.allowDeleteOperation !== true) { + return true; + } + return false; + } + + private CheckCreateRequestProps(props: ApiGatewayToSqsProps): boolean { + if ((props.createRequestTemplate || props.additionalCreateRequestTemplates || props.createIntegrationResponses) + && props.allowCreateOperation !== true) { + return true; + } + return false; + } private addActionToPolicy(action: string) { this.apiGatewayRole.addToPolicy(new iam.PolicyStatement({ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts index b852ccd5b..e3944ff67 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts @@ -239,10 +239,14 @@ export class FargateToS3 extends Construct { } // Add environment variables - const bucketArnEnvironmentVariableName = props.bucketArnEnvironmentVariableName || 'S3_BUCKET_ARN'; + const bucketArnEnvironmentVariableName = this.SetStringWithDefault(props.bucketArnEnvironmentVariableName, 'S3_BUCKET_ARN'); this.container.addEnvironment(bucketArnEnvironmentVariableName, this.s3BucketInterface.bucketArn); - const bucketEnvironmentVariableName = props.bucketEnvironmentVariableName || 'S3_BUCKET_NAME'; + const bucketEnvironmentVariableName = this.SetStringWithDefault(props.bucketEnvironmentVariableName, 'S3_BUCKET_NAME'); this.container.addEnvironment(bucketEnvironmentVariableName, this.s3BucketInterface.bucketName); } + + private SetStringWithDefault(value: string | undefined, defaultValue: string) { + return value || defaultValue; + } } diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts index 90322f731..1b930f7bd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts @@ -174,28 +174,7 @@ export class KinesisstreamsToGluejob extends Construct { this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); defaults.CheckProps(props); - - // custom props check - if (props.existingGlueJob && props.glueJobProps) { - throw Error("Either existingGlueJob instance or glueJobProps should be set, but found both"); - } - - if (!props.existingGlueJob) { - if (!props.glueJobProps.command.scriptLocation && !props.etlCodeAsset) { - throw Error('Either one of CfnJob.JobCommandProperty.scriptLocation or KinesisstreamsToGluejobProps.etlCodeAsset has ' + - 'to be provided. If the ETL Job code file exists in a local filesystem, please set ' + - 'KinesisstreamsToGluejobProps.etlCodeAsset. If the ETL Job is available in an S3 bucket, set the ' + - 'CfnJob.JobCommandProperty.scriptLocation property'); - } - - if (!props.etlCodeAsset) { - const s3Url: string = props.glueJobProps.command.scriptLocation; - const found = s3Url.match(/^s3:\/\/\S+\/\S+/g); - if (!(found && found.length > 0 && found[0].length === s3Url.length)) { - throw Error("Invalid S3 URL provided"); - } - } - } + defaults.CheckGlueProps(props); this.kinesisStream = defaults.buildKinesisStream(this, { existingStreamObj: props.existingStreamObj, @@ -204,10 +183,6 @@ export class KinesisstreamsToGluejob extends Construct { this.database = props.existingDatabase !== undefined ? props.existingDatabase : defaults.createGlueDatabase(scope, props.databaseProps); - if (props.fieldSchema === undefined && props.existingTable === undefined && props.tableProps === undefined) { - throw Error("Either fieldSchema or table property has to be set, both cannot be optional"); - } - if (props.existingTable !== undefined) { this.table = props.existingTable; } else { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts index df13e471c..988d5eb13 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts @@ -20,7 +20,7 @@ import * as cdk from "aws-cdk-lib"; import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; -test.only('Launch with minimal code and check structure', () => { +test('Launch with minimal code and check structure', () => { const stack = new cdk.Stack(); const testFunctionName = 'test-function-name24334'; const testBucketName = 'test-bucket-name12344'; diff --git a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts index e54e7d9b0..5e8608f29 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts @@ -29,8 +29,9 @@ import * as glue from 'aws-cdk-lib/aws-glue'; import * as sagemaker from 'aws-cdk-lib/aws-sagemaker'; import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager"; import * as kms from "aws-cdk-lib/aws-kms"; -import {ResponseHeadersPolicyProps} from "aws-cdk-lib/aws-cloudfront"; +import { ResponseHeadersPolicyProps } from "aws-cdk-lib/aws-cloudfront"; import * as opensearch from "aws-cdk-lib/aws-opensearchservice"; +import * as s3assets from "aws-cdk-lib/aws-s3-assets"; export interface VerifiedProps { readonly dynamoTableProps?: dynamodb.TableProps, @@ -58,9 +59,6 @@ export interface VerifiedProps { readonly topicProps?: sns.TopicProps, readonly existingTopicObj?: sns.Topic, - readonly glueJobProps?: glue.CfnJobProps, - readonly existingGlueJob?: glue.CfnJob, - readonly existingSagemakerEndpointObj?: sagemaker.CfnEndpoint, readonly endpointProps?: sagemaker.CfnEndpointProps, @@ -87,6 +85,7 @@ export interface VerifiedProps { readonly insertHttpSecurityHeaders?: boolean; readonly responseHeadersPolicyProps?: ResponseHeadersPolicyProps; readonly openSearchDomainProps?: opensearch.CfnDomainProps; + } /** @@ -111,7 +110,7 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } - if (propsObject.existingStreamObj && propsObject.kinesisStreamProps) { + if (propsObject.existingStreamObj && propsObject.kinesisStreamProps) { errorMessages += 'Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'; errorFound = true; } @@ -181,11 +180,6 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } - if (propsObject.glueJobProps && propsObject.existingGlueJob) { - errorMessages += 'Error - Either provide glueJobProps or existingGlueJob, but not both.\n'; - errorFound = true; - } - if (propsObject.existingSagemakerEndpointObj && propsObject.endpointProps) { errorMessages += 'Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'; errorFound = true; @@ -242,7 +236,53 @@ export function CheckProps(propsObject: VerifiedProps | any) { } if (propsObject.openSearchDomainProps?.vpcOptions) { - throw new Error("Error - Define VPC using construct parameters not the OpenSearch Service props"); + errorMessages += "Error - Define VPC using construct parameters not the OpenSearch Service props\n"; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} + +export interface GlueProps { + readonly existingGlueJob?: glue.CfnJob, + readonly etlCodeAsset?: s3assets.Asset; + readonly glueJobProps?: glue.CfnJobProps | any; + readonly fieldSchema?: glue.CfnTable.ColumnProperty[]; + readonly existingTable?: glue.CfnTable; + readonly tablePropss?: glue.CfnTableProps; + } + +export function CheckGlueProps(propsObject: GlueProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.glueJobProps && propsObject.existingGlueJob) { + errorMessages += 'Error - Either provide glueJobProps or existingGlueJob, but not both.\n'; + errorFound = true; + } + + if ((!propsObject.existingGlueJob) && (!propsObject.glueJobProps.command.scriptLocation && !propsObject.etlCodeAsset)) { + errorMessages += ('Either one of CfnJob.JobCommandProperty.scriptLocation or etlCodeAsset has ' + + 'to be provided. If the ETL Job code file exists in a local filesystem, please set ' + + 'KinesisstreamsToGluejobProps.etlCodeAsset. If the ETL Job is available in an S3 bucket, set the ' + + 'CfnJob.JobCommandProperty.scriptLocation property\n'); + errorFound = true; + } + + if (propsObject.glueJobProps?.command?.scriptLocation) { + const s3Url: string = propsObject.glueJobProps.command.scriptLocation; + const found = s3Url.match(/^s3:\/\/\S+\/\S+/g); + if (!(found && found.length > 0 && found[0].length === s3Url.length)) { + errorMessages += "Invalid S3 URL for Glue script provided\n"; + errorFound = true; + } + } + + if (propsObject.fieldSchema === undefined && propsObject.existingTable === undefined && propsObject.tableProps === undefined) { + errorMessages += "Either fieldSchema or table property has to be set, both cannot be omitted"; + errorFound = true; } if (errorFound) { @@ -256,7 +296,7 @@ export function CheckProps(propsObject: VerifiedProps | any) { export function CheckListValues(allowedPermissions: string[], submittedValues: string[], valueType: string) { submittedValues.forEach((submittedValue) => { if (!allowedPermissions.includes(submittedValue)) { - throw Error(`Invalid ${valueType} submitted - ${submittedValue}` ); + throw Error(`Invalid ${valueType} submitted - ${submittedValue}`); } }); } diff --git a/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts index 171811669..7a5893741 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts @@ -19,9 +19,6 @@ import { Bucket, BucketEncryption } from 'aws-cdk-lib/aws-s3'; import { RemovalPolicy, Stack } from "aws-cdk-lib"; import * as defaults from '..'; -// -------------------------------------------------------------- -// Test deployment with role creation -// -------------------------------------------------------------- test('Test deployment with role creation', () => { // Stack const stack = new Stack(); @@ -75,9 +72,6 @@ test('Test deployment with role creation', () => { }); }); -// -------------------------------------------------------------- -// Pass an existing Glue Job -// -------------------------------------------------------------- test('Create a Glue Job outside the construct', () => { // Stack const stack = new Stack(); @@ -138,9 +132,6 @@ test('Create a Glue Job outside the construct', () => { }); }); -// -------------------------------------------------------------- -// Provide additional parameters other than default ones -// -------------------------------------------------------------- test('Test custom deployment properties', () => { // Stack const stack = new Stack(); @@ -252,9 +243,6 @@ test('Test custom deployment properties', () => { }); }); -// -------------------------------------------------------------- -// Do not supply parameters and error out -// -------------------------------------------------------------- test('Do no supply glueJobProps or existingCfnJob and error out', () => { const stack = new Stack(); try { @@ -275,10 +263,7 @@ test('Do no supply glueJobProps or existingCfnJob and error out', () => { } }); -// -------------------------------------------------------------- -// Allow the construct to create the job role required -// -------------------------------------------------------------- -test('Test deployment with role creation', () => { +test('llow the construct to create the job role required', () => { // Stack const stack = new Stack(); const jobID = 'glueetl'; @@ -323,10 +308,7 @@ test('Test deployment with role creation', () => { }); }); -// -------------------------------------------------------------- -// Test deployment when output location is provided -// -------------------------------------------------------------- -test('Test deployment with role creation', () => { +test('Test deployment when output location is provided', () => { // Stack const stack = new Stack(); const jobID = 'glueetl'; @@ -376,49 +358,6 @@ test('Test deployment with role creation', () => { }); }); -// -------------------------------------------------------------- -// Test deployment when script location not provided - throw error -// -------------------------------------------------------------- -test('Test deployment with role creation', () => { - // Stack - const stack = new Stack(); - const jobID = 'glueetl'; - - const cfnJobProps = { - command: { - name: jobID, - pythonVersion: '3' - } - }; - - const database = defaults.createGlueDatabase(stack); - try { - defaults.buildGlueJob(stack, { - glueJobProps: cfnJobProps, - outputDataStore: { - datastoreType: defaults.SinkStoreType.S3, - existingS3OutputBucket: new Bucket(stack, 'OutputBucket', { - versioned: false - }) - }, - database, - table: defaults.createGlueTable(stack, database, undefined, [{ - name: "id", - type: "int", - comment: "" - }], 'kinesis', {STREAM_NAME: 'testStream'}) - }); - } catch (error) { - expect(error).toBeInstanceOf(Error); - expect(error.message).toEqual('Either one of CfnJob.JobCommandProperty.scriptLocation or KinesisstreamsToGluejobProps.etlCodeAsset ' + - 'has to be provided. If the ETL Job code file exists in a local filesystem, please set KinesisstreamsToGluejobProps.etlCodeAsset. ' + - 'If the ETL Job is available in an S3 bucket, set the CfnJob.JobCommandProperty.scriptLocation property'); - } -}); - -// -------------------------------------------------------------- -// Dont pass Job Command attributes and it should throw an error -// -------------------------------------------------------------- test('Test for incorrect Job Command property', () => { const stack = new Stack(); try { @@ -489,9 +428,6 @@ test('GlueJob configuration with glueVersion 2.0 should not support maxCapacity } }); -// -------------------------------------------------------------- -// Fail if setting maxCapacity and WorkerType/ NumberOfWorkers -// -------------------------------------------------------------- test('Cannot use maxCapacity and WorkerType, so error out', () => { const stack = new Stack(); try { diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts index fb991db03..506b999ee 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts @@ -148,7 +148,7 @@ test('Test fail Dead Letter Queue check', () => { test('Test fail Dead Letter Queue check with queueProps fifo set to true and undefined deadLetterQueueProps', () => { const props: defaults.VerifiedProps = { - queueProps: {fifo: true}, + queueProps: { fifo: true }, deadLetterQueueProps: {}, }; @@ -164,8 +164,8 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to true and und test('Test fail Dead Letter Queue check with queueProps fifo set to true and deadLetterQueueProps fifo set to false', () => { const props: defaults.VerifiedProps = { - queueProps: {fifo: true}, - deadLetterQueueProps: {fifo: false}, + queueProps: { fifo: true }, + deadLetterQueueProps: { fifo: false }, }; const app = () => { @@ -180,8 +180,8 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to true and dea test('Test fail Dead Letter Queue check with queueProps fifo set to false and deadLetterQueueProps fifo set to true', () => { const props: defaults.VerifiedProps = { - deadLetterQueueProps: {fifo: true}, - queueProps: {fifo: false}, + deadLetterQueueProps: { fifo: true }, + queueProps: { fifo: false }, }; const app = () => { @@ -196,7 +196,7 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to false and de test('Test fail Dead Letter Queue check with deadLetterQueueProps fifo set to true', () => { const props: defaults.VerifiedProps = { - deadLetterQueueProps: {fifo: true}, + deadLetterQueueProps: { fifo: true }, }; const app = () => { @@ -210,7 +210,7 @@ test('Test fail Dead Letter Queue check with deadLetterQueueProps fifo set to tr test('Test fail Dead Letter Queue check with queueProps fifo set to false', () => { const props: defaults.VerifiedProps = { - queueProps: {fifo: false}, + queueProps: { fifo: false }, }; const app = () => { @@ -269,7 +269,7 @@ test('Test fail S3 check', () => { const stack = new Stack(); const props: defaults.VerifiedProps = { - existingBucketObj: CreateScrapBucket(stack, { }), + existingBucketObj: CreateScrapBucket(stack, {}), bucketProps: {}, }; @@ -382,21 +382,86 @@ test('Test fail Glue job check', () => { }, role: new iam.Role(stack, 'JobRole', { assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') - }).roleArn}, 'testETLJob', {}); + }).roleArn + }, 'testETLJob', {}); const job = new glue.CfnJob(stack, 'placeholder', jobProps); - const props: defaults.VerifiedProps = { + const props: defaults.GlueProps = { glueJobProps: jobProps, existingGlueJob: job }; const app = () => { - defaults.CheckProps(props); + defaults.CheckGlueProps(props); + }; + + // Assertion + expect(app).toThrowError("Error - Either provide glueJobProps or existingGlueJob, but not both.\n"); +}); + +test('Test bad Glue script location', () => { + const stack = new Stack(); + + const _jobRole = new iam.Role(stack, 'CustomETLJobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }); + + const jobProps: glue.CfnJobProps = defaults.DefaultGlueJobProps(_jobRole, { + command: { + name: 'glueetl', + pythonVersion: '3', + scriptLocation: "s://bad/url", + }, + role: new iam.Role(stack, 'JobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }).roleArn + }, 'testETLJob', {}); + + const props: defaults.GlueProps = { + glueJobProps: jobProps, + }; + + const app = () => { + defaults.CheckGlueProps(props); }; // Assertion - expect(app).toThrowError('Error - Either provide glueJobProps or existingGlueJob, but not both.\n'); + expect(app).toThrowError('Invalid S3 URL for Glue script provided\n'); +}); + +test('Test missing Glue script lcoation', () => { + const stack = new Stack(); + + const _jobRole = new iam.Role(stack, 'CustomETLJobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }); + + const jobProps: glue.CfnJobProps = defaults.DefaultGlueJobProps(_jobRole, { + command: { + name: 'glueetl', + pythonVersion: '3', + }, + role: new iam.Role(stack, 'JobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }).roleArn + }, 'testETLJob', {}); + + const props: defaults.GlueProps = { + glueJobProps: jobProps, + }; + + const app = () => { + defaults.CheckGlueProps(props); + }; + + const expectedError: string = 'Either one of CfnJob.JobCommandProperty.scriptLocation or etlCodeAsset has ' + + 'to be provided. If the ETL Job code file exists in a local filesystem, please set ' + + 'KinesisstreamsToGluejobProps.etlCodeAsset. If the ETL Job is available in an S3 bucket, set the ' + + 'CfnJob.JobCommandProperty.scriptLocation property\n'; + + // Assertion + expect(app).toThrowError(expectedError); }); test('Test fail SageMaker endpoint check', () => { @@ -446,7 +511,7 @@ test('Test fail Secret check', () => { test('Test fail encryption key check', () => { const stack = new Stack(); - const key = defaults.buildEncryptionKey(stack, { + const key = defaults.buildEncryptionKey(stack, { enableKeyRotation: false }); @@ -468,7 +533,7 @@ test('Test fail Vpc check with deployVpc', () => { const props: defaults.VerifiedProps = { deployVpc: true, - existingVpc: defaults.buildVpc(stack, { + existingVpc: defaults.buildVpc(stack, { defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), }), }; @@ -486,7 +551,7 @@ test('Test fail Vpc check with vpcProps', () => { const props: defaults.VerifiedProps = { vpcProps: defaults.DefaultPublicPrivateVpcProps(), - existingVpc: defaults.buildVpc(stack, { + existingVpc: defaults.buildVpc(stack, { defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), }), }; From 450c518cec90e1665fed78ab55f44c4a92d50b3c Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 11 Sep 2023 16:29:20 -0400 Subject: [PATCH 45/73] Code Smells (#1006) --- .../aws-lambda-s3/lib/index.ts | 189 +++++++++--------- .../aws-route53-alb/lib/index.ts | 18 +- .../aws-route53-apigateway/lib/index.ts | 55 ++--- .../core/lib/kendra-helper.ts | 1 - .../core/lib/sqs-helper.ts | 17 +- 5 files changed, 151 insertions(+), 129 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts index 92c805d0d..aaf234198 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts @@ -79,110 +79,117 @@ export interface LambdaToS3Props { * * @default - Default props are used */ - readonly loggingBucketProps?: s3.BucketProps + readonly loggingBucketProps?: s3.BucketProps /** * Whether to turn on Access Logs for the S3 bucket with the associated storage costs. * Enabling Access Logging is a best practice. * * @default - true */ - readonly logS3AccessLogs?: boolean; + readonly logS3AccessLogs?: boolean; } /** * @summary The LambdaToS3 class. */ export class LambdaToS3 extends Construct { - public readonly lambdaFunction: lambda.Function; - public readonly s3Bucket?: s3.Bucket; - public readonly s3LoggingBucket?: s3.Bucket; - public readonly vpc?: ec2.IVpc; - public readonly s3BucketInterface: s3.IBucket; - - /** - * @summary Constructs a new instance of the LambdaToS3 class. - * @param {cdk.App} scope - represents the scope for all the resources. - * @param {string} id - this is a a scope-unique id. - * @param {LambdaToS3Props} props - user provided props for the construct. - * @since 0.8.0 - * @access public - */ - constructor(scope: Construct, id: string, props: LambdaToS3Props) { - super(scope, id); - - // All our tests are based upon this behavior being on, so we're setting - // context here rather than assuming the client will set it - this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - - defaults.CheckProps(props); - - if (props.bucketPermissions) { - defaults.CheckListValues(['Delete', 'Put', 'Read', 'ReadWrite', 'Write'], props.bucketPermissions, 'bucket permission'); - } - - let bucket: s3.IBucket; - - if (props.deployVpc || props.existingVpc) { - this.vpc = defaults.buildVpc(scope, { - defaultVpcProps: defaults.DefaultIsolatedVpcProps(), - existingVpc: props.existingVpc, - userVpcProps: props.vpcProps, - constructVpcProps: { - enableDnsHostnames: true, - enableDnsSupport: true, - }, - }); - - defaults.AddAwsServiceEndpoint(scope, this.vpc, defaults.ServiceEndpointTypes.S3); - } - - // Setup the Lambda function - this.lambdaFunction = defaults.buildLambdaFunction(this, { - existingLambdaObj: props.existingLambdaObj, - lambdaFunctionProps: props.lambdaFunctionProps, - vpc: this.vpc, + public readonly lambdaFunction: lambda.Function; + public readonly s3Bucket?: s3.Bucket; + public readonly s3LoggingBucket?: s3.Bucket; + public readonly vpc?: ec2.IVpc; + public readonly s3BucketInterface: s3.IBucket; + + /** + * @summary Constructs a new instance of the LambdaToS3 class. + * @param {cdk.App} scope - represents the scope for all the resources. + * @param {string} id - this is a a scope-unique id. + * @param {LambdaToS3Props} props - user provided props for the construct. + * @since 0.8.0 + * @access public + */ + constructor(scope: Construct, id: string, props: LambdaToS3Props) { + super(scope, id); + + // All our tests are based upon this behavior being on, so we're setting + // context here rather than assuming the client will set it + this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); + + defaults.CheckProps(props); + + if (props.bucketPermissions) { + defaults.CheckListValues(['Delete', 'Put', 'Read', 'ReadWrite', 'Write'], props.bucketPermissions, 'bucket permission'); + } + + let bucket: s3.IBucket; + + if (props.deployVpc || props.existingVpc) { + this.vpc = defaults.buildVpc(scope, { + defaultVpcProps: defaults.DefaultIsolatedVpcProps(), + existingVpc: props.existingVpc, + userVpcProps: props.vpcProps, + constructVpcProps: { + enableDnsHostnames: true, + enableDnsSupport: true, + }, + }); + + defaults.AddAwsServiceEndpoint(scope, this.vpc, defaults.ServiceEndpointTypes.S3); + } + + // Setup the Lambda function + this.lambdaFunction = defaults.buildLambdaFunction(this, { + existingLambdaObj: props.existingLambdaObj, + lambdaFunctionProps: props.lambdaFunctionProps, + vpc: this.vpc, + }); + + // Setup S3 Bucket + if (!props.existingBucketObj) { + const buildS3BucketResponse = defaults.buildS3Bucket(this, { + bucketProps: props.bucketProps, + loggingBucketProps: props.loggingBucketProps, + logS3AccessLogs: props.logS3AccessLogs }); + this.s3Bucket = buildS3BucketResponse.bucket; + this.s3LoggingBucket = buildS3BucketResponse.loggingBucket; - // Setup S3 Bucket - if (!props.existingBucketObj) { - const buildS3BucketResponse = defaults.buildS3Bucket(this, { - bucketProps: props.bucketProps, - loggingBucketProps: props.loggingBucketProps, - logS3AccessLogs: props.logS3AccessLogs - }); - this.s3Bucket = buildS3BucketResponse.bucket; - this.s3LoggingBucket = buildS3BucketResponse.loggingBucket; - - bucket = this.s3Bucket; - } else { - bucket = props.existingBucketObj; - } - - this.s3BucketInterface = bucket; - - // Configure environment variables - const bucketEnvironmentVariableName = props.bucketEnvironmentVariableName || 'S3_BUCKET_NAME'; - this.lambdaFunction.addEnvironment(bucketEnvironmentVariableName, bucket.bucketName); - - // Add the requested or default bucket permissions - if (props.bucketPermissions) { - if (props.bucketPermissions.includes('Delete')) { - bucket.grantDelete(this.lambdaFunction.grantPrincipal); - } - if (props.bucketPermissions.includes('Put')) { - bucket.grantPut(this.lambdaFunction.grantPrincipal); - } - if (props.bucketPermissions.includes('Read')) { - bucket.grantRead(this.lambdaFunction.grantPrincipal); - } - if (props.bucketPermissions.includes('ReadWrite')) { - bucket.grantReadWrite(this.lambdaFunction.grantPrincipal); - } - if (props.bucketPermissions.includes('Write')) { - bucket.grantWrite(this.lambdaFunction.grantPrincipal); - } - } else { - bucket.grantReadWrite(this.lambdaFunction.grantPrincipal); - } + bucket = this.s3Bucket; + } else { + bucket = props.existingBucketObj; + } + + this.s3BucketInterface = bucket; + + // Configure environment variables + const bucketEnvironmentVariableName = props.bucketEnvironmentVariableName || 'S3_BUCKET_NAME'; + this.lambdaFunction.addEnvironment(bucketEnvironmentVariableName, bucket.bucketName); + + // Add the requested or default bucket permissions + if (props.bucketPermissions) { + this.AssignAppropriatePrivileges(props, bucket, this.lambdaFunction); + } else { + bucket.grantReadWrite(this.lambdaFunction.grantPrincipal); + } + } + + private AssignAppropriatePrivileges(props: LambdaToS3Props, bucket: s3.IBucket, clientFunction: lambda.Function) { + if (!props.bucketPermissions) { + throw new Error('bucketPermissions required here'); + } + if (props.bucketPermissions.includes('Delete')) { + bucket.grantDelete(clientFunction.grantPrincipal); + } + if (props.bucketPermissions.includes('Put')) { + bucket.grantPut(clientFunction.grantPrincipal); + } + if (props.bucketPermissions.includes('Read')) { + bucket.grantRead(clientFunction.grantPrincipal); + } + if (props.bucketPermissions.includes('ReadWrite')) { + bucket.grantReadWrite(clientFunction.grantPrincipal); + } + if (props.bucketPermissions.includes('Write')) { + bucket.grantWrite(clientFunction.grantPrincipal); } + } } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts index 60a80a31e..6f4bb3489 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts @@ -107,13 +107,7 @@ export class Route53ToAlb extends Construct { // NOTE: We don't call CheckAlbProps() here, because this construct creates an ALB // with no listener or target, so some of those checks don't apply - if (props?.loadBalancerProps?.vpc) { - throw new Error('Specify any existing VPC at the construct level, not within loadBalancerProps.'); - } - - if (props.existingLoadBalancerObj && !props.existingVpc) { - throw new Error('An existing ALB already exists in a VPC, so that VPC must be passed to the construct in props.existingVpc'); - } + this.PropsCustomCheck(props); if (props.existingHostedZoneInterface && !props.publicApi && !props.existingVpc) { throw new Error('An existing Private Hosted Zone already exists in a VPC, so that VPC must be passed to the construct in props.existingVpc'); @@ -167,4 +161,14 @@ export class Route53ToAlb extends Construct { // Before turning off SonarQube for the line, reduce the line to it's minimum new r53.ARecord(this, arecordId, arecordProps); // NOSONAR } + + private PropsCustomCheck(props: Route53ToAlbProps) { + if (props?.loadBalancerProps?.vpc) { + throw new Error('Specify any existing VPC at the construct level, not within loadBalancerProps.'); + } + + if (props.existingLoadBalancerObj && !props.existingVpc) { + throw new Error('An existing ALB already exists in a VPC, so that VPC must be passed to the construct in props.existingVpc'); + } + } } diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts index bb1c001e4..ef1a2cf07 100755 --- a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts @@ -95,32 +95,12 @@ export class Route53ToApiGateway extends Construct { // Existing Public or Private Hosted Zone if (props.existingHostedZoneInterface) { this.hostedZone = props.existingHostedZoneInterface; + this.ExistingHostedZonePropCheck(props); - if (props.existingVpc) { - throw new Error('Cannot provide an existing VPC to an existing Private Hosted Zone.'); - } - if (props.privateHostedZoneProps) { - throw new Error('Must provide either existingHostedZoneInterface or privateHostedZoneProps, but not both.'); - } } else { // Creating a Private Hosted Zone - if (props.publicApi) { - throw new Error('Public APIs require an existingHostedZone be passed in the Props object.'); - } else { - if (!props.privateHostedZoneProps) { - throw new Error('Must provide either existingHostedZoneInterface or privateHostedZoneProps.'); - } - if (props.privateHostedZoneProps.vpc) { - throw new Error('All VPC specs must be provided at the Construct level in Route53ToApiGatewayProps.'); - } - if (!props.privateHostedZoneProps.zoneName) { - throw new Error('Must supply zoneName for Private Hosted Zone Props.'); - } - if ( !this.vpc ) { - throw new Error('Must specify an existingVPC for the Private Hosted Zone in the construct props.'); - } - const manufacturedProps: route53.PrivateHostedZoneProps = defaults.overrideProps(props.privateHostedZoneProps, { vpc: this.vpc }); - this.hostedZone = new route53.PrivateHostedZone(this, `${id}-zone`, manufacturedProps); - } + this.PrivateHostedZonePropsChecks(props); + const manufacturedProps: route53.PrivateHostedZoneProps = defaults.overrideProps(props.privateHostedZoneProps, { vpc: this.vpc }); + this.hostedZone = new route53.PrivateHostedZone(this, `${id}-zone`, manufacturedProps); } // Convert IRestApi to RestApi @@ -140,4 +120,31 @@ export class Route53ToApiGateway extends Construct { // Create A Record in custom domain to route traffic to API Gateway new route53.ARecord(this, 'CustomDomainAliasRecord', arecordProps); // NOSONAR } + + private ExistingHostedZonePropCheck(props: Route53ToApiGatewayProps) { + if (props.existingVpc) { + throw new Error('Cannot provide an existing VPC to an existing Private Hosted Zone.'); + } + if (props.privateHostedZoneProps) { + throw new Error('Must provide either existingHostedZoneInterface or privateHostedZoneProps, but not both.'); + } + } + + private PrivateHostedZonePropsChecks(props: Route53ToApiGatewayProps) { + if (props.publicApi) { + throw new Error('Public APIs require an existingHostedZone be passed in the Props object.'); + } + if (!props.privateHostedZoneProps) { + throw new Error('Must provide either existingHostedZoneInterface or privateHostedZoneProps.'); + } + if (props.privateHostedZoneProps.vpc) { + throw new Error('All VPC specs must be provided at the Construct level in Route53ToApiGatewayProps.'); + } + if (!props.privateHostedZoneProps.zoneName) { + throw new Error('Must supply zoneName for Private Hosted Zone Props.'); + } + if (!this.vpc) { + throw new Error('Must specify an existingVPC for the Private Hosted Zone in the construct props.'); + } + } } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts index 65d94c116..821552472 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts @@ -24,7 +24,6 @@ import { Aws } from 'aws-cdk-lib'; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate import { Construct } from 'constructs'; import { DefaultKendraIndexProps } from './kendra-defaults'; -import { } from "./utils"; export interface BuildKendraIndexProps { readonly kendraIndexProps?: kendra.CfnIndexProps | any; diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts index 15fcec8c7..0d93060ee 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts @@ -76,12 +76,7 @@ export interface BuildQueueResponse { * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ export function buildQueue(scope: Construct, id: string, props: BuildQueueProps): BuildQueueResponse { - - if ((props.queueProps?.encryptionMasterKey || props.encryptionKey || props.encryptionKeyProps) - && props.enableEncryptionWithCustomerManagedKey === true) { - printWarning(`Ignoring enableEncryptionWithCustomerManagedKey because one of - queueProps.encryptionMasterKey, encryptionKey, or encryptionKeyProps was already specified`); - } + CheckEncryptionWarnings(props); // If an existingQueueObj is not specified if (!props.existingQueueObj) { @@ -127,6 +122,16 @@ export function buildQueue(scope: Construct, id: string, props: BuildQueueProps) } } +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + */ +function CheckEncryptionWarnings(props: BuildQueueProps) { + if ((props.queueProps?.encryptionMasterKey || props.encryptionKey || props.encryptionKeyProps) + && props.enableEncryptionWithCustomerManagedKey === true) { + printWarning(`Ignoring enableEncryptionWithCustomerManagedKey because one of + queueProps.encryptionMasterKey, encryptionKey, or encryptionKeyProps was already specified`); + } +} export interface BuildDeadLetterQueueProps { /** * Existing instance of SQS queue object, providing both this and queueProps will cause an error. From 004fcf146fc34bc62eb2fb7baf9a359c43fa5349 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Tue, 12 Sep 2023 08:44:08 -0400 Subject: [PATCH 46/73] Address more cognitive issues (#1007) --- .../core/lib/fargate-helper.ts | 14 +- .../core/lib/glue-job-helper.ts | 6 +- .../core/lib/sagemaker-helper.ts | 136 +++++++++--------- .../core/test/fargate-helper.test.ts | 4 +- 4 files changed, 88 insertions(+), 72 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts index f47e31c38..1043d8f4a 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts @@ -267,10 +267,10 @@ export function CheckFargateProps(props: any) { "If you provide a cluster in fargateServiceProps then you cannot provide clusterProps\n"; } - if (props.clusterProps?.vpc) { + if (CheckForInvalidVpcs(props)) { errorFound = true; errorMessages += - "All services in the construct use the construct VPC, you cannot specify a VPC in clusterProps\n"; + "Provide all VPC info at Construct level, not within clusterProps nor targetGroupProps\n"; } if ( @@ -290,6 +290,16 @@ export function CheckFargateProps(props: any) { } } +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + */ +export function CheckForInvalidVpcs(props: any): boolean { + if (props.clusterProps?.vpc || props.targetGroupProps?.vpc) { + return true; + } + return false; +} + /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ diff --git a/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts index 104cf6e71..068158738 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts @@ -215,12 +215,10 @@ export function deployGlueJob(scope: Construct, glueJobProps: glue.CfnJobProps, } else { // create CDK Bucket instance from S3 url and grant read access to Glue Job's service principal if (isJobCommandProperty(newGlueJobProps.command)) { - if (!newGlueJobProps.command.scriptLocation) { - throw Error('Script location has to be provided as an s3 Url location. Script location cannot be empty'); - } const scriptLocation = newGlueJobProps.command.scriptLocation; - const scriptBucketLocation: IBucket = Bucket.fromBucketArn(scope, 'ScriptLocaiton', getS3ArnfromS3Url(scriptLocation)); + // Incoming Props, including scriptLocation, are checked upstream in CheckGlueProps() + const scriptBucketLocation: IBucket = Bucket.fromBucketArn(scope, 'ScriptLocaiton', getS3ArnfromS3Url(scriptLocation!)); scriptBucketLocation.grantRead(jobRole); } } diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts index 654cbe9b2..706bdb785 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts @@ -240,79 +240,87 @@ export function buildSagemakerNotebook( let subnetId: string; // Conditional Sagemaker Notebook creation - if (!props.existingNotebookObj) { + if (props.existingNotebookObj) { + return { notebook: props.existingNotebookObj }; + } + + if (CheckNotebookVpcProps(props)) { + throw new Error('Must define both sagemakerNotebookProps.subnetId and sagemakerNotebookProps.securityGroupIds'); + } + + addPermissions(props.role); + + if (props.sagemakerNotebookProps?.kmsKeyId === undefined) { + kmsKeyId = buildEncryptionKey(scope).keyId; + } else { + kmsKeyId = props.sagemakerNotebookProps.kmsKeyId; + } + + if (props.deployInsideVpc === undefined || props.deployInsideVpc) { if ( - (props.sagemakerNotebookProps?.subnetId && props.sagemakerNotebookProps?.securityGroupIds === undefined) || - (props.sagemakerNotebookProps?.subnetId === undefined && props.sagemakerNotebookProps?.securityGroupIds) + props.sagemakerNotebookProps?.subnetId === undefined && + props.sagemakerNotebookProps?.securityGroupIds === undefined ) { - throw new Error('Must define both sagemakerNotebookProps.subnetId and sagemakerNotebookProps.securityGroupIds'); - } - - addPermissions(props.role); + vpcInstance = buildVpc(scope, { + defaultVpcProps: DefaultPublicPrivateVpcProps(), + }); + securityGroup = buildSecurityGroup( + scope, + 'SecurityGroup', + { + vpc: vpcInstance, + allowAllOutbound: false, + }, + [], + [{ peer: ec2.Peer.anyIpv4(), connection: ec2.Port.tcp(443) }] + ); - if (props.sagemakerNotebookProps?.kmsKeyId === undefined) { - kmsKeyId = buildEncryptionKey(scope).keyId; - } else { - kmsKeyId = props.sagemakerNotebookProps.kmsKeyId; - } + subnetId = vpcInstance.privateSubnets[0].subnetId; - if (props.deployInsideVpc === undefined || props.deployInsideVpc) { - if ( - props.sagemakerNotebookProps?.subnetId === undefined && - props.sagemakerNotebookProps?.securityGroupIds === undefined - ) { - vpcInstance = buildVpc(scope, { - defaultVpcProps: DefaultPublicPrivateVpcProps(), - }); - securityGroup = buildSecurityGroup( - scope, - 'SecurityGroup', - { - vpc: vpcInstance, - allowAllOutbound: false, - }, - [], - [{ peer: ec2.Peer.anyIpv4(), connection: ec2.Port.tcp(443) }] - ); - - subnetId = vpcInstance.privateSubnets[0].subnetId; - - sagemakerNotebookProps = DefaultSagemakerNotebookProps(props.role.roleArn, kmsKeyId, subnetId, [ - securityGroup.securityGroupId, - ]); - } else { - sagemakerNotebookProps = DefaultSagemakerNotebookProps( - props.role.roleArn, - kmsKeyId, - props.sagemakerNotebookProps?.subnetId, - props.sagemakerNotebookProps?.securityGroupIds - ); - } + sagemakerNotebookProps = DefaultSagemakerNotebookProps(props.role.roleArn, kmsKeyId, subnetId, [ + securityGroup.securityGroupId, + ]); } else { - sagemakerNotebookProps = DefaultSagemakerNotebookProps(props.role.roleArn, kmsKeyId); + sagemakerNotebookProps = DefaultSagemakerNotebookProps( + props.role.roleArn, + kmsKeyId, + props.sagemakerNotebookProps?.subnetId, + props.sagemakerNotebookProps?.securityGroupIds + ); } + } else { + sagemakerNotebookProps = DefaultSagemakerNotebookProps(props.role.roleArn, kmsKeyId); + } - sagemakerNotebookProps = consolidateProps(sagemakerNotebookProps, props.sagemakerNotebookProps); - - // Create the notebook - // NOSONAR: (typescript:S6319) - // keyID is created above in the if (props.sagemakerNotebookProps?.kmsKeyId === undefined) - // block. It is then passed to DefaultSagemakerNotebookProps() - // This behavior is validated in unit test - const sagemakerInstance: sagemaker.CfnNotebookInstance = new sagemaker.CfnNotebookInstance( - scope, - 'SagemakerNotebook', - sagemakerNotebookProps // NOSONAR - ); - if (vpcInstance) { - return { notebook: sagemakerInstance, vpc: vpcInstance, securityGroup }; - } else { - return { notebook: sagemakerInstance }; - } + sagemakerNotebookProps = consolidateProps(sagemakerNotebookProps, props.sagemakerNotebookProps); + + // Create the notebook + // NOSONAR: (typescript:S6319) + // keyID is created above in the if (props.sagemakerNotebookProps?.kmsKeyId === undefined) + // block. It is then passed to DefaultSagemakerNotebookProps() + // This behavior is validated in unit test + const sagemakerInstance: sagemaker.CfnNotebookInstance = new sagemaker.CfnNotebookInstance( + scope, + 'SagemakerNotebook', + sagemakerNotebookProps // NOSONAR + ); + if (vpcInstance) { + return { notebook: sagemakerInstance, vpc: vpcInstance, securityGroup }; } else { - // Return existing notebook object - return { notebook: props.existingNotebookObj }; + return { notebook: sagemakerInstance }; + } +} + +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + */ +function CheckNotebookVpcProps(props: BuildSagemakerNotebookProps): boolean { + if ((props.sagemakerNotebookProps?.subnetId && props.sagemakerNotebookProps?.securityGroupIds === undefined) || + (props.sagemakerNotebookProps?.subnetId === undefined && props.sagemakerNotebookProps?.securityGroupIds) + ) { + return true; } + return false; } export interface BuildSagemakerEndpointProps { diff --git a/source/patterns/@aws-solutions-constructs/core/test/fargate-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/fargate-helper.test.ts index 0bbe984cc..c49bc067a 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/fargate-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/fargate-helper.test.ts @@ -343,7 +343,7 @@ test('Check providing vpc in the targetGroupsProps is an error', () => { defaults.CheckFargateProps(props); }; - expect(app).toThrowError("Provide all VPC info at Construct level, not within targetGroupProps\n"); + expect(app).toThrowError("Provide all VPC info at Construct level, not within clusterProps nor targetGroupProps\n"); }); test('Check providing taskDefinition in the fargateServiceProps is an error', () => { @@ -380,7 +380,7 @@ test('Check providing vpc in clusterProps is an error', () => { defaults.CheckFargateProps(props); }; - expect(app).toThrowError("All services in the construct use the construct VPC, you cannot specify a VPC in clusterProps\n"); + expect(app).toThrowError("Provide all VPC info at Construct level, not within clusterProps nor targetGroupProps\n"); }); test('Check providing existing service without existing container and existing VPC is an error', () => { From beda87530a1e7a43f0fb3de9c7c12af0719ea9d6 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Wed, 13 Sep 2023 07:51:37 -0400 Subject: [PATCH 47/73] fix more Cognitive issues (input-validation) (#1008) --- .../aws-fargate-dynamodb/lib/index.ts | 1 + .../test/fargate-dynamodb.test.ts | 44 +++++++ .../aws-fargate-sns/lib/index.ts | 1 + .../aws-fargate-sns/test/fargate-sns.test.ts | 32 ++++- .../aws-iot-lambda-dynamodb/lib/index.ts | 1 + .../test/iot-lambda-dynamodb.test.ts | 47 ++++++++ .../aws-lambda-dynamodb/lib/index.ts | 1 + .../test/lambda-dynamodb.test.ts | 36 ++++++ .../aws-lambda-sns/lib/index.ts | 1 + .../aws-lambda-sns/test/lambda-sns.test.ts | 27 +++++ .../aws-sns-lambda/lib/index.ts | 1 + .../aws-sns-lambda/test/sns-lambda.test.ts | 27 +++++ .../aws-sns-sqs/lib/index.ts | 1 + .../aws-sns-sqs/test/sns-sqs.test.ts | 31 ++++- .../core/lib/fargate-helper.ts | 29 +++-- .../core/lib/input-validation.ts | 112 ++++++++++++------ .../core/test/input-validation.test.ts | 68 ++++++----- 17 files changed, 374 insertions(+), 86 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts index b254086ef..d937e6b3b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts @@ -142,6 +142,7 @@ export class FargateToDynamoDB extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckDynamoDBProps(props); // Other permissions for constructs are accepted as arrays, turning tablePermissions into // an array to use the same validation function. diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts index 5324cd6fb..1e535817d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts @@ -669,4 +669,48 @@ test('test error invalid table permission', () => { }; expect(app).toThrowError('Invalid tablePermission submitted - REED'); +}); + +test('test that DDB input args are getting checked', () => { + const stack = new cdk.Stack(); + const publicApi = false; + const serviceName = 'custom-name'; + const tableName = 'custom-table-name'; + + const existingVpc = defaults.getTestVpc(stack, publicApi); + + const createFargateServiceResponse = defaults.CreateFargateService(stack, 'test', { + constructVpc: existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clientFargateServiceProps: { + serviceName + } + }); + + const existingTable = new dynamodb.Table(stack, 'MyTablet', { + tableName, + partitionKey: { + name: 'id', + type: dynamodb.AttributeType.STRING + } + }); + + const app = () => { + new FargateToDynamoDB(stack, 'test-construct', { + publicApi, + existingFargateServiceObject: createFargateServiceResponse.service, + existingContainerDefinitionObject: createFargateServiceResponse.containerDefinition, + existingVpc, + existingTableInterface: existingTable, + dynamoTableProps: { + tableName, + partitionKey: { + name: 'id', + type: dynamodb.AttributeType.STRING + }, + }, + }); + }; + + expect(app).toThrowError('Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts index 5db6f1ce9..fb89e4034 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts @@ -155,6 +155,7 @@ export class FargateToSns extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckSnsProps(props); this.vpc = defaults.buildVpc(scope, { existingVpc: props.existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts index 3684666ae..b68b8da3f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts @@ -496,4 +496,34 @@ test('Topic is encrypted with customer managed KMS Key when enable encryption fl ] }, }); -}); \ No newline at end of file +}); + +test('Confirm CheckSnsProps is being called', () => { + // An environment with region is required to enable logging on an ALB + const stack = new cdk.Stack(undefined, undefined, { + env: { account: "123456789012", region: 'us-east-1' }, + }); + const publicApi = false; + const topicName = 'custom-topic-name'; + + const existingVpc = defaults.getTestVpc(stack, publicApi); + + const existingTopic = new sns.Topic(stack, 'MyTopic', { + topicName + }); + + const app = () => { + new FargateToSns(stack, 'test-construct', { + publicApi, + existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + existingTopicObject: existingTopic, + topicProps: { + topicName: 'topic-name' + }, + }); + }; + + // Assertion + expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/lib/index.ts index 7426ed2a2..1a9715d69 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/lib/index.ts @@ -95,6 +95,7 @@ export class IotToLambdaToDynamoDB extends Construct { constructor(scope: Construct, id: string, props: IotToLambdaToDynamoDBProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSnsProps(props); // Other permissions for constructs are accepted as arrays, turning tablePermissions into // an array to use the same validation function. diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts index 5a2aca4f6..42f7e8ff3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts @@ -616,3 +616,50 @@ test("Test bad call with existingVpc and deployVpc", () => { // Assertion expect(app).toThrowError(); }); + +// NOTE: existingTableObj was omitted from the interface for this construct, +// so this test cannot be run. Leaving it here so it can be used if/when existingTableObj +// is added to the interface +// +// test("Confirm CheckDynamoDBProps is getting called", () => { +// const stack = new cdk.Stack(); +// const tableName = 'table-name'; + +// const existingTable = new dynamodb.Table(stack, 'MyTablet', { +// tableName, +// partitionKey: { +// name: 'id', +// type: dynamodb.AttributeType.STRING +// } +// }); + +// const props: IotToLambdaToDynamoDBProps = { +// lambdaFunctionProps: { +// code: lambda.Code.fromAsset(`${__dirname}/lambda`), +// runtime: lambda.Runtime.NODEJS_16_X, +// handler: 'index.handler' +// }, +// iotTopicRuleProps: { +// topicRulePayload: { +// ruleDisabled: false, +// description: "Processing of DTC messages from the AWS Connected Vehicle Solution.", +// sql: "SELECT * FROM 'connectedcar/dtc/#'", +// actions: [] +// } +// }, +// existingTableObj: existingTable, +// dynamoTableProps: { +// tableName, +// partitionKey: { +// name: 'id', +// type: dynamodb.AttributeType.STRING +// }, +// }, +// }; + +// const app = () => { +// new IotToLambdaToDynamoDB(stack, 'test-iot-lambda-dynamodb-stack', props); +// }; + +// expect(app).toThrowError('Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'); +// }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts index 73cfa2d0e..2376bc92b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts @@ -91,6 +91,7 @@ export class LambdaToDynamoDB extends Construct { constructor(scope: Construct, id: string, props: LambdaToDynamoDBProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckDynamoDBProps(props); // Other permissions for constructs are accepted as arrays, turning tablePermissions into // an array to use the same validation function. diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts index 1b586b259..ea878a52a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts @@ -802,4 +802,40 @@ test('Test bad table permission', () => { // Assertion expect(app).toThrowError(/Invalid table permission submitted - Reed/); +}); + +test('Test that CheckDynamoDBProps is getting called', () => { + const stack = new cdk.Stack(); + const tableName = 'custom-table-name'; + + const existingTable = new dynamodb.Table(stack, 'MyTablet', { + tableName, + partitionKey: { + name: 'id', + type: dynamodb.AttributeType.STRING + } + }); + + const props: LambdaToDynamoDBProps = { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler' + }, + existingTableObj: existingTable, + dynamoTableProps: { + tableName, + partitionKey: { + name: 'id', + type: dynamodb.AttributeType.STRING + }, + }, + }; + + const app = () => { + new LambdaToDynamoDB(stack, 'test-lambda-dynamodb-stack', props); + }; + + // Assertion + expect(app).toThrowError(/Error - Either provide existingTableObj or dynamoTableProps, but not both.\n/); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts index eb3072a10..765e36c99 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts @@ -114,6 +114,7 @@ export class LambdaToSns extends Construct { constructor(scope: Construct, id: string, props: LambdaToSnsProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSnsProps(props); if (props.deployVpc || props.existingVpc) { this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts index 9cb585c4c..145c7fbf2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts @@ -578,4 +578,31 @@ test('Error is thrown when conflicting VPC information is provided', () => { }; expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.'); +}); + +test('Test that CheckSnsProps is getting called', () => { + const stack = new Stack(); + + const topic = new sns.Topic(stack, 'MyTopic', { + topicName: "custom-topic" + }); + + const props: LambdaToSnsProps = { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler' + }, + existingTopicObj: topic, + topicProps: { + topicName: 'topic-name' + }, + }; + + const app = () => { + new LambdaToSns(stack, 'test-lambda-dynamodb-stack', props); + }; + + // Assertion + expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts index 86ff8ea10..702c88eff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts @@ -86,6 +86,7 @@ export class SnsToLambda extends Construct { constructor(scope: Construct, id: string, props: SnsToLambdaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSnsProps(props); // Setup the Lambda function this.lambdaFunction = defaults.buildLambdaFunction(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts index 1e4f0b71c..d948929a0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts @@ -236,3 +236,30 @@ test('Topic is encrypted with customer managed KMS Key when enable encryption fl }, }); }); + +test('Confirm CheckSnsProps is getting called', () => { + const stack = new cdk.Stack(); + + const topic = new sns.Topic(stack, 'MyTopic', { + topicName: "custom-topic" + }); + + const props: SnsToLambdaProps = { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler' + }, + existingTopicObj: topic, + topicProps: { + topicName: 'topic-name' + } + }; + + const app = () => { + new SnsToLambda(stack, 'test-sns-lambda', props); + }; + + // Assertion + expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); +}); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts index 142c719e4..d4955ef40 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts @@ -116,6 +116,7 @@ export class SnsToSqs extends Construct { constructor(scope: Construct, id: string, props: SnsToSqsProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSnsProps(props); // Setup the dead letter queue, if applicable this.deadLetterQueue = defaults.buildDeadLetterQueue(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts index 86278f8bd..6f5f3a79d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts @@ -132,9 +132,6 @@ test('Test getter methods', () => { expect(app.deadLetterQueue !== null); }); -// -------------------------------------------------------------- -// Test deployment with existing queue, and topic -// -------------------------------------------------------------- test('Test deployment w/ existing queue, and topic', () => { // Stack const stack = new Stack(); @@ -162,9 +159,6 @@ test('Test deployment w/ existing queue, and topic', () => { }); }); -// -------------------------------------------------------------- -// Test deployment with imported encryption key -// -------------------------------------------------------------- test('Test deployment with imported encryption key', () => { // Stack const stack = new Stack(); @@ -499,4 +493,29 @@ test('Construct does not override unencrypted topic when passed in existingTopic expect(testConstruct.snsTopic).toBeDefined(); expect(testConstruct.encryptionKey).not.toBeDefined(); +}); + +test('Confirm that CheckSnsProps is called', () => { + // Stack + const stack = new Stack(); + // Helper declaration + const topic = new sns.Topic(stack, "existing-topic-obj", { + topicName: 'existing-topic-obj' + }); + const queue = new sqs.Queue(stack, 'existing-queue-obj', { + queueName: 'existing-queue-obj' + }); + + const app = () => { + new SnsToSqs(stack, 'sns-to-sqs-stack', { + existingTopicObj: topic, + topicProps: { + topicName: 'topic-name' + }, + existingQueueObj: queue + }); + }; + + // Assertion + expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts index 1043d8f4a..c832c79b8 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts @@ -224,16 +224,7 @@ export function CheckFargateProps(props: any) { let errorMessages = ""; let errorFound = false; - if ( - props.existingFargateServiceObject && - (props.existingImageObject || - props.ecrImageVersion || - props.containerDefinitionProps || - props.fargateTaskDefinitionProps || - props.ecrRepositoryArn || - props.fargateServiceProps || - props.clusterProps) - ) { + if (CheckForConflictingServiceProps(props)) { errorFound = true; errorMessages += "If you provide an existingFargateServiceObject, you cannot provide any props defining a new service\n"; @@ -290,6 +281,24 @@ export function CheckFargateProps(props: any) { } } +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + */ +export function CheckForConflictingServiceProps(props: any): boolean { + if (props.existingFargateServiceObject && + (props.existingImageObject || + props.ecrImageVersion || + props.containerDefinitionProps || + props.fargateTaskDefinitionProps || + props.ecrRepositoryArn || + props.fargateServiceProps || + props.clusterProps) + ) { + return true; + } + return false; +} + /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ diff --git a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts index 5e8608f29..1377e4fd0 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts @@ -34,10 +34,6 @@ import * as opensearch from "aws-cdk-lib/aws-opensearchservice"; import * as s3assets from "aws-cdk-lib/aws-s3-assets"; export interface VerifiedProps { - readonly dynamoTableProps?: dynamodb.TableProps, - readonly existingTableObj?: dynamodb.Table, - readonly existingTableInterface?: dynamodb.ITable, - readonly existingStreamObj?: kinesis.Stream; readonly kinesisStreamProps?: kinesis.StreamProps, @@ -56,15 +52,14 @@ export interface VerifiedProps { readonly existingBucketInterface?: s3.IBucket, readonly bucketProps?: s3.BucketProps, - readonly topicProps?: sns.TopicProps, - readonly existingTopicObj?: sns.Topic, - readonly existingSagemakerEndpointObj?: sagemaker.CfnEndpoint, readonly endpointProps?: sagemaker.CfnEndpointProps, readonly existingSecretObj?: secretsmanager.Secret; readonly secretProps?: secretsmanager.SecretProps; + readonly topicProps?: sns.TopicProps, + readonly existingVpc?: ec2.IVpc; readonly vpcProps?: ec2.VpcProps; readonly deployVpc?: boolean; @@ -100,16 +95,6 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } - if (propsObject.dynamoTableProps && propsObject.existingTableObj) { - errorMessages += 'Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'; - errorFound = true; - } - - if (propsObject.dynamoTableProps && propsObject.existingTableInterface) { - errorMessages += 'Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'; - errorFound = true; - } - if (propsObject.existingStreamObj && propsObject.kinesisStreamProps) { errorMessages += 'Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'; errorFound = true; @@ -160,26 +145,6 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } - if (propsObject.existingBucketInterface && propsObject.bucketProps) { - errorMessages += 'Error - Either provide bucketProps or existingBucketInterface, but not both.\n'; - errorFound = true; - } - - if (propsObject.topicProps && propsObject.existingTopicObj) { - errorMessages += 'Error - Either provide topicProps or existingTopicObj, but not both.\n'; - errorFound = true; - } - - if (propsObject.topicProps?.masterKey && propsObject.encryptionKey) { - errorMessages += 'Error - Either provide topicProps.masterKey or encryptionKey, but not both.\n'; - errorFound = true; - } - - if (propsObject.topicProps?.masterKey && propsObject.encryptionKeyProps) { - errorMessages += 'Error - Either provide topicProps.masterKey or encryptionKeyProps, but not both.\n'; - errorFound = true; - } - if (propsObject.existingSagemakerEndpointObj && propsObject.endpointProps) { errorMessages += 'Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'; errorFound = true; @@ -252,7 +217,7 @@ export interface GlueProps { readonly fieldSchema?: glue.CfnTable.ColumnProperty[]; readonly existingTable?: glue.CfnTable; readonly tablePropss?: glue.CfnTableProps; - } +} export function CheckGlueProps(propsObject: GlueProps | any) { let errorMessages = ''; @@ -290,6 +255,77 @@ export function CheckGlueProps(propsObject: GlueProps | any) { } } +export interface DynamoDBProps { + readonly dynamoTableProps?: dynamodb.TableProps, + readonly existingTableObj?: dynamodb.Table, + readonly existingTableInterface?: dynamodb.ITable, +} + +export function CheckDynamoDBProps(propsObject: DynamoDBProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.dynamoTableProps && propsObject.existingTableObj) { + errorMessages += 'Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'; + errorFound = true; + } + + if (propsObject.dynamoTableProps && propsObject.existingTableInterface) { + errorMessages += 'Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} + +export interface SnsProps { + readonly topicProps?: sns.TopicProps, + readonly existingTopicObj?: sns.Topic, + readonly existingTopicObject?: sns.Topic, + readonly encryptionKey?: kms.Key, + readonly encryptionKeyProps?: kms.KeyProps +} + +export function CheckSnsProps(propsObject: SnsProps | any) { + let errorMessages = ''; + let errorFound = false; + + // FargateToSns used TopicObject instead of TopicObj - to fix would be a breaking change, so we + // must look for both here. + if (propsObject.topicProps && (propsObject.existingTopicObj || propsObject.existingTopicObject)) { + errorMessages += 'Error - Either provide topicProps or existingTopicObj, but not both.\n'; + errorFound = true; + } + + if (propsObject.topicProps?.masterKey && propsObject.encryptionKey) { + errorMessages += 'Error - Either provide topicProps.masterKey or encryptionKey, but not both.\n'; + errorFound = true; + } + + if (propsObject.topicProps?.masterKey && propsObject.encryptionKeyProps) { + errorMessages += 'Error - Either provide topicProps.masterKey or encryptionKeyProps, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} + +export interface DynamoDBProps { +} + +// export function CheckDynamoDBProps(propsObject: GlueProps | any) { +// let errorMessages = ''; +// let errorFound = false; + +// if (errorFound) { +// throw new Error(errorMessages); +// } +// } + /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts index 506b999ee..aa3f0d250 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts @@ -35,22 +35,41 @@ test('Test with valid props', () => { defaults.CheckProps(props); }); +// --------------------------- +// DynamoDB Prop Tests +// --------------------------- test('Test fail DynamoDB table check', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.DynamoDBProps = { existingTableObj: new dynamodb.Table(stack, 'placeholder', defaults.DefaultTableProps), dynamoTableProps: defaults.DefaultTableProps, }; const app = () => { - defaults.CheckProps(props); + defaults.CheckDynamoDBProps(props); }; // Assertion expect(app).toThrowError('Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'); }); +test('Test fail DynamoDB table check (for interface)', () => { + const stack = new Stack(); + + const props: defaults.DynamoDBProps = { + existingTableInterface: new dynamodb.Table(stack, 'placeholder', defaults.DefaultTableProps), + dynamoTableProps: defaults.DefaultTableProps, + }; + + const app = () => { + defaults.CheckDynamoDBProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'); +}); + test("Test fail Lambda function check", () => { const stack = new Stack(); @@ -281,16 +300,19 @@ test('Test fail S3 check', () => { expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); }); +// --------------------------- +// Sns Prop Tests +// --------------------------- test('Test fail SNS topic check', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.SnsProps = { topicProps: {}, existingTopicObj: new sns.Topic(stack, 'placeholder', {}) }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSnsProps(props); }; // Assertion @@ -300,13 +322,13 @@ test('Test fail SNS topic check', () => { test('Test fail SNS topic check with bad topic attribute name', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.SnsProps = { topicProps: {}, existingTopicObj: new sns.Topic(stack, 'placeholder', {}) }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSnsProps(props); }; // Assertion @@ -333,7 +355,7 @@ test('Test fail SNS topic check when both encryptionKey and encryptionKeyProps a test('Test fail SNS topic check when both topicProps.masterKey and encryptionKeyProps are specified', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.SnsProps = { topicProps: { masterKey: new kms.Key(stack, 'key') }, @@ -343,7 +365,7 @@ test('Test fail SNS topic check when both topicProps.masterKey and encryptionKey }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSnsProps(props); }; expect(app).toThrowError('Error - Either provide topicProps.masterKey or encryptionKeyProps, but not both.\n'); @@ -352,7 +374,7 @@ test('Test fail SNS topic check when both topicProps.masterKey and encryptionKey test('Test fail SNS topic check when both encryptionKey and topicProps.masterKey are specified', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.SnsProps = { encryptionKey: new kms.Key(stack, 'key'), topicProps: { masterKey: new kms.Key(stack, 'otherkey') @@ -360,13 +382,17 @@ test('Test fail SNS topic check when both encryptionKey and topicProps.masterKey }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSnsProps(props); }; // Assertion expect(app).toThrowError('Error - Either provide topicProps.masterKey or encryptionKey, but not both.\n'); }); +// --------------------------- +// --------------------------- +// Glue Prop Tests +// --------------------------- test('Test fail Glue job check', () => { const stack = new Stack(); @@ -463,6 +489,7 @@ test('Test missing Glue script lcoation', () => { // Assertion expect(app).toThrowError(expectedError); }); +// --------------------------- test('Test fail SageMaker endpoint check', () => { const stack = new Stack(); @@ -564,27 +591,6 @@ test('Test fail Vpc check with vpcProps', () => { expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); -test('Test fail multiple failures message', () => { - const stack = new Stack(); - - const props: defaults.VerifiedProps = { - secretProps: {}, - existingSecretObj: defaults.buildSecretsManagerSecret(stack, 'secret', {}), - topicProps: {}, - existingTopicObj: new sns.Topic(stack, 'placeholder', {}) - }; - - const app = () => { - defaults.CheckProps(props); - }; - - // Assertion - expect(app).toThrowError( - 'Error - Either provide topicProps or existingTopicObj, but not both.\n' + - 'Error - Either provide secretProps or existingSecretObj, but not both.\n' - ); -}); - test('Test fail existing log bucket and log bucket prop check', () => { const stack = new Stack(); From 73172bb652b4ba0b89ffb6fc32a24f7190a79c6a Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Fri, 15 Sep 2023 08:13:55 -0400 Subject: [PATCH 48/73] chore(all): reduce cognitive complexity (#1009) * extract s3 and sqs prop checking * removed alb bucket check from CheckS3Props * Check VPC and S3 props --- .../aws-alb-fargate/lib/index.ts | 1 + .../aws-alb-fargate/test/alb-fargate.test.ts | 21 ++ .../aws-alb-lambda/lib/index.ts | 1 + .../aws-alb-lambda/test/alb-lambda.test.ts | 29 ++- .../aws-apigateway-sqs/lib/index.ts | 1 + .../test/apigateway-sqs.test.ts | 19 +- .../aws-cloudfront-s3/lib/index.ts | 1 + .../test/test.cloudfront-s3.test.ts | 7 +- ...treams-lambda-elasticsearch-kibana.test.ts | 20 +- .../eventbridge-kinesisfirehose-s3.test.ts | 20 ++ .../aws-eventbridge-sns/lib/index.ts | 1 + .../test/eventbridge-sns-topic.test.ts | 20 ++ .../aws-eventbridge-sqs/lib/index.ts | 1 + .../test/eventbridge-sqs-queue.test.ts | 25 ++- .../aws-fargate-dynamodb/lib/index.ts | 1 + .../test/fargate-dynamodb.test.ts | 37 +++- .../aws-fargate-eventbridge/lib/index.ts | 1 + .../test/fargate-eventbridge.test.ts | 29 ++- .../aws-fargate-kinesisfirehose/lib/index.ts | 1 + .../test/aws-fargate-kinesisfirehose.test.ts | 30 ++- .../aws-fargate-kinesisstreams/lib/index.ts | 1 + .../test/fargate-kinesisstreams.test.ts | 30 ++- .../aws-fargate-opensearch/lib/index.ts | 1 + .../test/fargate-opensearch.test.ts | 30 ++- .../aws-fargate-s3/lib/index.ts | 2 + .../aws-fargate-s3/test/fargate-s3.test.ts | 58 +++++- .../aws-fargate-secretsmanager/lib/index.ts | 1 + .../test/fargate-secretsmanager.test.ts | 29 ++- .../aws-fargate-sns/lib/index.ts | 1 + .../aws-fargate-sns/test/fargate-sns.test.ts | 28 ++- .../aws-fargate-sqs/lib/index.ts | 2 + .../aws-fargate-sqs/test/fargate-sqs.test.ts | 53 ++++- .../lib/index.ts | 1 + .../test/fargate-ssmstringparameter.test.ts | 28 ++- .../aws-fargate-stepfunctions/lib/index.ts | 1 + .../test/fargate-stepfunctions.test.ts | 26 ++- .../test/test.iot-kinesisfirehose-s3.test.ts | 4 +- .../test/iot-lambda-dynamodb.test.ts | 4 +- .../aws-iot-s3/lib/index.ts | 1 + .../aws-iot-s3/test/iot-s3.test.ts | 22 ++ .../aws-iot-sqs/lib/index.ts | 1 + .../aws-iot-sqs/test/iot-sqs.test.ts | 26 ++- ...isfirehose-s3-and-kinesisanalytics.test.ts | 4 +- .../aws-kinesisfirehose-s3/lib/index.ts | 1 + .../test/kinesisfirehose-s3.test.ts | 7 +- .../kinesisstreams-kinesisfirehose-s3.test.ts | 21 +- .../aws-lambda-dynamodb/lib/index.ts | 5 +- .../test/lambda-dynamodb.test.ts | 7 +- .../lib/index.ts | 1 + .../test/lambda-elasticachememcached.test.ts | 24 ++- .../lib/index.ts | 1 + .../test/lambda-elasticsearch-kibana.test.ts | 20 +- .../aws-lambda-eventbridge/lib/index.ts | 5 +- .../test/aws-lambda-eventbridge.test.ts | 29 +-- .../aws-lambda-kendra/lib/index.ts | 1 + .../test/lambda-kendra.test.ts | 78 +++---- .../aws-lambda-kinesisfirehose/lib/index.ts | 1 + .../test/aws-lambda-kinesisfirehose.test.ts | 29 +++ .../aws-lambda-kinesisstreams/lib/index.ts | 1 + .../test/lambda-kinesisstream.test.ts | 29 ++- .../aws-lambda-opensearch/lib/index.ts | 1 + .../test/lambda-opensearch.test.ts | 25 +++ .../aws-lambda-s3/lib/index.ts | 2 + .../aws-lambda-s3/test/lambda-s3.test.ts | 96 ++++----- .../aws-lambda-sagemakerendpoint/lib/index.ts | 4 +- .../test/aws-lambda-sagemakerendpoint.test.ts | 11 +- .../aws-lambda-secretsmanager/lib/index.ts | 4 +- .../test/lambda-secretsmanager.test.ts | 45 +--- .../aws-lambda-sns/lib/index.ts | 1 + .../aws-lambda-sns/test/lambda-sns.test.ts | 62 +----- .../test/lambda-sqs-lambda.test.ts | 71 +++---- .../aws-lambda-sqs/lib/index.ts | 2 + .../aws-lambda-sqs/test/lambda-sqs.test.ts | 68 +++--- .../lib/index.ts | 1 + .../test/lambda-ssmstringparameter.test.ts | 40 +--- .../aws-lambda-stepfunctions/lib/index.ts | 4 +- .../test/lambda-stepfunctions.test.ts | 37 +--- .../aws-s3-lambda/lib/index.ts | 1 + .../aws-s3-lambda/test/s3-lambda.test.ts | 18 +- .../aws-s3-sns/lib/index.ts | 2 + .../aws-s3-sns/test/test.s3-sns.test.ts | 39 +++- .../aws-s3-sqs/lib/index.ts | 2 + .../aws-s3-sqs/test/test.s3-sqs.test.ts | 64 +++--- .../aws-s3-stepfunctions/lib/index.ts | 1 + .../test/s3-stepfunctions.test.ts | 2 +- .../aws-sns-sqs/lib/index.ts | 1 + .../aws-sns-sqs/test/sns-sqs.test.ts | 42 ++-- .../aws-sqs-lambda/lib/index.ts | 1 + .../test/test.sqs-lambda.test.ts | 38 ++-- .../core/lib/input-validation.ts | 193 ++++++++++-------- .../core/test/input-validation.test.ts | 99 +++++---- 91 files changed, 1216 insertions(+), 641 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts index bee06a834..bd9e7ba9c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts @@ -167,6 +167,7 @@ export class AlbToFargate extends Construct { defaults.CheckProps(props); defaults.CheckAlbProps(props); defaults.CheckFargateProps(props); + defaults.CheckVpcProps(props); // Obtain VPC for construct (existing or created) this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts index cedb5437f..ab0664025 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts @@ -463,3 +463,24 @@ test('Test HTTPS API with new vpc, load balancer, service and private API', () = ] }); }); + +test('Confirm that CheckVpcProps is called', () => { + const stack = new cdk.Stack(undefined, undefined, { + env: { account: "123456789012", region: 'us-east-1' }, + }); + + const props: AlbToFargateProps = { + ecrRepositoryArn: defaults.fakeEcrRepoArn, + listenerProps: { + certificates: [defaults.getFakeCertificate(stack, "fake-cert")] + }, + publicApi: false, + vpcProps: {}, + existingVpc: defaults.getTestVpc(stack), + }; + const app = () => { + new AlbToFargate(stack, 'new-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts index 147becab9..68c7d21b4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts @@ -123,6 +123,7 @@ export class AlbToLambda extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckAlbProps(props); + defaults.CheckVpcProps(props); // Obtain VPC for construct (existing or created) this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts index 6e8f60539..2d629a3d2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts @@ -247,7 +247,7 @@ test("Test existing load balancer and existing lambda function", () => { existingLambdaObj: lambdaFunction, existingLoadBalancerObj: existingAlb, listenerProps: { - certificates: [ defaults.getFakeCertificate(stack, "fake-cert") ], + certificates: [defaults.getFakeCertificate(stack, "fake-cert")], }, publicApi: true, existingVpc: testExistingVpc, @@ -289,7 +289,7 @@ test('Test new load balancer and new lambda function', () => { }); const props: AlbToLambdaProps = { - lambdaFunctionProps: { + lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', @@ -952,3 +952,28 @@ test('Test existingLoadBalancerObj and no existingVpc is an error', () => { expect(app).toThrowError( /An existing ALB is already in a VPC, that VPC must be provided in props.existingVpc for the rest of the construct to use./); }); + +test('Confirm that CheckVpcProps is called', () => { + const stack = new cdk.Stack(undefined, undefined, { + env: { account: "123456789012", region: 'us-east-1' }, + }); + + const props: AlbToLambdaProps = { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler' + }, + listenerProps: { + certificates: [defaults.getFakeCertificate(stack, "fake-cert")] + }, + publicApi: false, + vpcProps: {}, + existingVpc: defaults.getTestVpc(stack), + }; + const app = () => { + new AlbToLambda(stack, 'new-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts index 7503879c9..40431218f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts @@ -197,6 +197,7 @@ export class ApiGatewayToSqs extends Construct { constructor(scope: Construct, id: string, props: ApiGatewayToSqsProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSqsProps(props); if (this.CheckCreateRequestProps(props)) { throw new Error(`The 'allowCreateOperation' property must be set to true when setting any of the following: ` + diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts index bffefbe46..1b42dfe6a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts @@ -12,7 +12,7 @@ */ // Imports -import { Stack } from "aws-cdk-lib"; +import { RemovalPolicy, Stack } from "aws-cdk-lib"; import { ApiGatewayToSqs } from '../lib'; import * as api from "aws-cdk-lib/aws-apigateway"; import * as kms from 'aws-cdk-lib/aws-kms'; @@ -634,4 +634,19 @@ test('Construct throws error when deleteIntegrationResponses is set and allowDel }); expect(app).toThrowError(/The 'allowDeleteOperation' property must be set to true when setting any of the following: 'deleteRequestTemplate', 'additionalDeleteRequestTemplates', 'deleteIntegrationResponses'/); -}); \ No newline at end of file +}); + +test('Confirm the CheckSqsProps is being called', () => { + const stack = new Stack(); + + const app = () => { + new ApiGatewayToSqs(stack, 'api-gateway-sqs', { + queueProps: { + removalPolicy: RemovalPolicy.DESTROY, + }, + existingQueueObj: new sqs.Queue(stack, 'test', {}) + }); + }; + + expect(app).toThrowError(/Error - Either provide queueProps or existingQueueObj, but not both.\n/); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts index 9e720bb25..7f597b5f0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts @@ -112,6 +112,7 @@ export class CloudFrontToS3 extends Construct { this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); defaults.CheckProps(props); + defaults.CheckS3Props(props); let bucket: s3.IBucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts index c4e1ee100..14889c679 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts @@ -147,10 +147,7 @@ test('check properties', () => { expect(construct.s3Bucket !== null); }); -// -------------------------------------------------------------- -// Test bad call with existingBucket and bucketProps -// -------------------------------------------------------------- -test("Test bad call with existingBucket and bucketProps", () => { +test("Confirm CheckS3Props is called", () => { // Stack const stack = new cdk.Stack(); @@ -166,7 +163,7 @@ test("Test bad call with existingBucket and bucketProps", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); }); test("Test existingBucketObj", () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts index 5ebf9de4e..b084ebdb9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts @@ -226,4 +226,22 @@ test('Test minimal deployment with an existing isolated VPC', () => { template.resourceCountIs("AWS::EC2::VPC", 1); expect(construct.vpc).toBeDefined(); -}); \ No newline at end of file +}); + +test('Confirm CheckVpcProps is being called', () => { + const stack = new cdk.Stack(); + + const app = () => { + new DynamoDBStreamsToLambdaToElasticSearchAndKibana(stack, 'test-construct', { + lambdaFunctionProps: getDefaultTestLambdaProps(), + domainName: "test", + deployVpc: true, + vpcProps: { + vpcName: "existing-vpc-test" + }, + existingVpc: defaults.getTestVpc(stack), + }); + }; + + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts index d6cd33a6f..9d9cebb09 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts @@ -291,3 +291,23 @@ test('Supply an existing logging bucket', () => { template.resourceCountIs("AWS::S3::Bucket", 2); }); + +test('Confirm CheckS3Props is being called', () => { + // For L4 constructs, the call is within the internal L3 constructs + const stack = new cdk.Stack(); + + const props: EventbridgeToKinesisFirehoseToS3Props = { + eventRuleProps: { + eventPattern: { + source: ['solutionsconstructs'] + } + }, + bucketProps: {}, + existingBucketObj: new s3.Bucket(stack, 'test-bucket', {}), + }; + + const app = () => { + new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-firehose', props); + }; + expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts index 4f4c50a05..b9781dd9d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts @@ -88,6 +88,7 @@ export class EventbridgeToSns extends Construct { constructor(scope: Construct, id: string, props: EventbridgeToSnsProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSnsProps(props); let enableEncryptionParam = props.enableEncryptionWithCustomerManagedKey; if (props.enableEncryptionWithCustomerManagedKey === undefined || diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts index 9c42d25e8..76045d8e0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts @@ -390,4 +390,24 @@ test('Properties correctly set when unencrypted existing topic is provided', () expect(testConstruct.snsTopic).toBeDefined(); expect(testConstruct.encryptionKey).not.toBeDefined(); +}); + +test('Confirm CheckSnsProps is being called', () => { + const stack = new cdk.Stack(); + const existingTopicObj = new sns.Topic(stack, 'Topic', { + topicName: 'existing-topic-name' + }); + + const props: EventbridgeToSnsProps = { + existingTopicObj, + topicProps: {}, + eventRuleProps: { + schedule: events.Schedule.rate(cdk.Duration.minutes(5)) + } + }; + const app = () => { + new EventbridgeToSns(stack, 'test', props); + }; + + expect(app).toThrowError("Error - Either provide topicProps or existingTopicObj, but not both.\n"); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/lib/index.ts index 9d9aae2a8..ca236a852 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/lib/index.ts @@ -117,6 +117,7 @@ export class EventbridgeToSqs extends Construct { constructor(scope: Construct, id: string, props: EventbridgeToSqsProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSqsProps(props); // Setup the dead letter queue, if applicable this.deadLetterQueue = defaults.buildDeadLetterQueue(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts index c34701aa8..260eb00b2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts @@ -14,6 +14,7 @@ import * as cdk from 'aws-cdk-lib'; import { EventbridgeToSqs, EventbridgeToSqsProps } from '../lib'; import * as events from "aws-cdk-lib/aws-events"; +import * as sqs from "aws-cdk-lib/aws-sqs"; import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; @@ -535,4 +536,26 @@ test('Queue purging flag grants correct permissions', () => { } ] }); -}); \ No newline at end of file +}); + +test('check that CheckSqsProps is being called', () => { + const stack = new cdk.Stack(); + + const props: EventbridgeToSqsProps = { + eventRuleProps: { + eventPattern: { + source: ['solutionsconstructs'] + } + }, + eventBusProps: { eventBusName: 'test' }, + queueProps: { + removalPolicy: cdk.RemovalPolicy.DESTROY, + }, + existingQueueObj: new sqs.Queue(stack, 'test', {}) + }; + + const app = () => { + new EventbridgeToSqs(stack, 'test-eventbridge-sqs', props); + }; + expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts index d937e6b3b..e2602aa4e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts @@ -143,6 +143,7 @@ export class FargateToDynamoDB extends Construct { defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckDynamoDBProps(props); + defaults.CheckVpcProps(props); // Other permissions for constructs are accepted as arrays, turning tablePermissions into // an array to use the same validation function. diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts index 1e535817d..23c011611 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts @@ -14,7 +14,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToDynamoDB } from "../lib"; +import { FargateToDynamoDB, FargateToDynamoDBProps } from "../lib"; import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; @@ -713,4 +713,37 @@ test('test that DDB input args are getting checked', () => { }; expect(app).toThrowError('Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'); -}); \ No newline at end of file +}); + +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + const clusterName = "custom-cluster-name"; + const containerName = "custom-container-name"; + const serviceName = "custom-service-name"; + const familyName = "custom-family-name"; + + const props: FargateToDynamoDBProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + dynamoTableProps: { + tableName: 'fake-name', + partitionKey: { + name: 'id', + type: dynamodb.AttributeType.STRING + }, + }, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToDynamoDB(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts index 06b577b7f..0c97a19d2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts @@ -134,6 +134,7 @@ export class FargateToEventbridge extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckVpcProps(props); this.vpc = defaults.buildVpc(scope, { existingVpc: props.existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts index 780dca7ff..0a8e7f10e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts @@ -14,7 +14,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToEventbridge } from "../lib"; +import { FargateToEventbridge, FargateToEventbridgeProps } from "../lib"; import * as events from 'aws-cdk-lib/aws-events'; import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; @@ -372,4 +372,29 @@ function createFargateConstructWithNewResources(stack: cdk.Stack, publicApi: boo eventBusName: 'custom-name' } }); -} \ No newline at end of file +} + +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + + const props: FargateToEventbridgeProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + eventBusProps: { + eventBusName: 'custom-name' + }, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToEventbridge(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts index 42cee3e2b..3cd6c3c6e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts @@ -127,6 +127,7 @@ export class FargateToKinesisFirehose extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckVpcProps(props); if (!props.existingKinesisFirehose.deliveryStreamName) { throw new Error('existingKinesisFirehose must have a defined deliveryStreamName'); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts index 3c35374d4..7ea1a788d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts @@ -13,7 +13,7 @@ import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToKinesisFirehose } from "../lib"; +import { FargateToKinesisFirehose, FargateToKinesisFirehoseProps } from "../lib"; import * as ecs from 'aws-cdk-lib/aws-ecs'; import { Match, Template } from "aws-cdk-lib/assertions"; import { GetTestFirehoseDestination } from './test-helper'; @@ -711,3 +711,31 @@ test('Test fail if existingFirehose does not have a stream name', () => { expect(app).toThrowError(/existingKinesisFirehose must have a defined deliveryStreamName/); }); + +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + const clusterName = "custom-cluster-name"; + const containerName = "custom-container-name"; + const serviceName = "custom-service-name"; + const familyName = "custom-family-name"; + const destination = GetTestFirehoseDestination(stack, 'test-destination'); + + const props: FargateToKinesisFirehoseProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + existingKinesisFirehose: destination.kinesisFirehose, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToKinesisFirehose(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts index b87cdb3a4..57b95b6e8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts @@ -152,6 +152,7 @@ export class FargateToKinesisStreams extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckVpcProps(props); // Setup the VPC this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts index ea17271b0..15740bc9d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts @@ -11,7 +11,7 @@ * and limitations under the License. */ -import { FargateToKinesisStreams } from "../lib"; +import { FargateToKinesisStreams, FargateToKinesisStreamsProps } from "../lib"; import * as cdk from "aws-cdk-lib"; import * as kinesis from 'aws-cdk-lib/aws-kinesis'; import * as defaults from '@aws-solutions-constructs/core'; @@ -596,4 +596,30 @@ test('Construct uses existingFargateServiceObject when provided', () => { template.hasResourceProperties("AWS::ECS::Service", { ServiceName: 'my-service', }); -}); \ No newline at end of file +}); + +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + const clusterName = "custom-cluster-name"; + const containerName = "custom-container-name"; + const serviceName = "custom-service-name"; + const familyName = "custom-family-name"; + + const props: FargateToKinesisStreamsProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToKinesisStreams(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts index e38b9a469..c9365df97 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts @@ -147,6 +147,7 @@ export class FargateToOpenSearch extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckVpcProps(props); this.vpc = defaults.buildVpc(scope, { existingVpc: props.existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts index 277a64796..9d0b29c48 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts @@ -14,7 +14,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToOpenSearch } from "../lib"; +import { FargateToOpenSearch, FargateToOpenSearchProps } from "../lib"; import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; @@ -737,3 +737,31 @@ test('Check error for using OpenSearch VPC prop parameter', () => { expect(app).toThrowError("Error - Define VPC using construct parameters not the OpenSearch Service props"); }); + +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + const clusterName = "custom-cluster-name"; + const containerName = "custom-container-name"; + const serviceName = "custom-service-name"; + const familyName = "custom-family-name"; + + const props: FargateToOpenSearchProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + openSearchDomainName: DOMAIN_NAME, + cognitoDomainName: COGNITO_DOMAIN_NAME, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToOpenSearch(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts index e3944ff67..f57723cbf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts @@ -163,6 +163,8 @@ export class FargateToS3 extends Construct { defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckS3Props(props); + defaults.CheckVpcProps(props); if (props.bucketPermissions) { defaults.CheckListValues(['Delete', 'Read', 'Write'], props.bucketPermissions, 'bucket permission'); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts index a88b2c016..f4d3d4bdc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts @@ -14,7 +14,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToS3 } from "../lib"; +import { FargateToS3, FargateToS3Props } from "../lib"; import * as s3 from 'aws-cdk-lib/aws-s3'; import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; @@ -700,3 +700,59 @@ test('Existing service/existing bucket, private API, existing VPC', () => { template.resourceCountIs('AWS::ECS::Service', 1); template.resourceCountIs('AWS::S3::Bucket', 1); }); + +test('New service/new bucket, public API, new VPC', () => { + // An environment with region is required to enable logging on an ALB + const stack = new cdk.Stack(); + const publicApi = true; + const clusterName = "custom-cluster-name"; + const containerName = "custom-container-name"; + const serviceName = "custom-service-name"; + const bucketName = "custom-bucket-name"; + const familyName = "family-name"; + + const props = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + vpcProps: { ipAddresses: ec2.IpAddresses.cidr('172.0.0.0/16') }, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + bucketProps: { bucketName }, + existingBucketObj: new s3.Bucket(stack, 'test-bucket', {}), + logS3AccessLogs: false, + bucketPermissions: ['Delete', 'Read', 'Write'] + }; + const app = () => { + new FargateToS3(stack, 'test-one', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); +}); + +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + const clusterName = "custom-cluster-name"; + const containerName = "custom-container-name"; + const serviceName = "custom-service-name"; + const familyName = "custom-family-name"; + + const props: FargateToS3Props = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToS3(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts index 4b93937cc..3f2ef2551 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts @@ -136,6 +136,7 @@ export class FargateToSecretsmanager extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckVpcProps(props); // Other permissions for constructs are accepted as arrays, turning grantWriteAccess into // an array to use the same validation function. diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts index d1d2dd005..ac84bf248 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts @@ -14,7 +14,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToSecretsmanager } from "../lib"; +import { FargateToSecretsmanager, FargateToSecretsmanagerProps } from "../lib"; import * as ecs from 'aws-cdk-lib/aws-ecs'; import { buildSecretsManagerSecret } from '@aws-solutions-constructs/core'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; @@ -637,4 +637,29 @@ test('Test error invalid secret permission', () => { }; expect(app).toThrowError('Invalid grantWriteAccess submitted - REED'); -}); \ No newline at end of file +}); + +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + + const props: FargateToSecretsmanagerProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + secretProps: { + secretName + }, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToSecretsmanager(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts index fb89e4034..dcf2b3751 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts @@ -156,6 +156,7 @@ export class FargateToSns extends Construct { defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckSnsProps(props); + defaults.CheckVpcProps(props); this.vpc = defaults.buildVpc(scope, { existingVpc: props.existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts index b68b8da3f..b22d033c9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts @@ -14,7 +14,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToSns } from "../lib"; +import { FargateToSns, FargateToSnsProps } from "../lib"; import * as kms from 'aws-cdk-lib/aws-kms'; import * as sns from 'aws-cdk-lib/aws-sns'; import * as ecs from 'aws-cdk-lib/aws-ecs'; @@ -527,3 +527,29 @@ test('Confirm CheckSnsProps is being called', () => { // Assertion expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); }); + +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + const clusterName = "custom-cluster-name"; + const containerName = "custom-container-name"; + const serviceName = "custom-service-name"; + const familyName = "custom-family-name"; + + const props: FargateToSnsProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToSns(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts index 28cb40a7b..3dd776d39 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts @@ -180,6 +180,8 @@ export class FargateToSqs extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckSqsProps(props); + defaults.CheckVpcProps(props); if (props.queuePermissions) { defaults.CheckListValues(['Read', 'Write'], props.queuePermissions, 'queue permission'); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts index 092c50666..f614177c3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts @@ -14,7 +14,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToSqs } from "../lib"; +import { FargateToSqs, FargateToSqsProps } from "../lib"; import * as kms from 'aws-cdk-lib/aws-kms'; import * as sqs from 'aws-cdk-lib/aws-sqs'; import * as ecs from 'aws-cdk-lib/aws-ecs'; @@ -617,4 +617,53 @@ test('Queue is encrypted with customer managed KMS Key when enable encryption fl ] } }); -}); \ No newline at end of file +}); + +test('Confirm CheckSqsProps is called', () => { + + // An environment with region is required to enable logging on an ALB + const stack = new cdk.Stack(); + const publicApi = false; + + const props = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + vpcProps: { ipAddresses: ec2.IpAddresses.cidr('172.0.0.0/16') }, + deployDeadLetterQueue: false, + queueProps: { + removalPolicy: cdk.RemovalPolicy.DESTROY, + }, + existingQueueObj: new sqs.Queue(stack, 'test', {}) + }; + + const app = () => { + new FargateToSqs(stack, 'test-fargate-sqs', props); + }; + expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); +}); + +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + const clusterName = "custom-cluster-name"; + const containerName = "custom-container-name"; + const serviceName = "custom-service-name"; + const familyName = "custom-family-name"; + + const props: FargateToSqsProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToSqs(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts index 69474adac..114694b19 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts @@ -135,6 +135,7 @@ export class FargateToSsmstringparameter extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckVpcProps(props); // Other permissions for constructs are accepted as arrays, turning stringParameterPermissions into // an array to use the same validation function. diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts index 09ad54249..283ee5be6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts @@ -14,7 +14,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToSsmstringparameter } from "../lib"; +import { FargateToSsmstringparameter, FargateToSsmstringparameterProps } from "../lib"; import * as ssm from 'aws-cdk-lib/aws-ssm'; import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; @@ -810,6 +810,32 @@ test('Test error no existing object or prop provided', () => { expect(app).toThrowError('existingStringParameterObj or stringParameterProps needs to be provided.'); }); +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + + const props: FargateToSsmstringparameterProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + stringParameterProps: { + parameterName, + stringValue + }, + existingVpc: defaults.getTestVpc(stack), + vpcProps: { }, + }; + + const app = () => { + new FargateToSsmstringparameter(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); + function createSsmParameterStore(stack: cdk.Stack) { return new ssm.StringParameter(stack, 'Parameter', { allowedPattern, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts index 056c3f2d1..9871f2b05 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts @@ -140,6 +140,7 @@ export class FargateToStepfunctions extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckFargateProps(props); + defaults.CheckVpcProps(props); this.vpc = defaults.buildVpc(scope, { existingVpc: props.existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts index 66910d5da..6b065aa35 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/fargate-stepfunctions.test.ts @@ -13,7 +13,7 @@ import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; -import { FargateToStepfunctions } from "../lib"; +import { FargateToStepfunctions, FargateToStepfunctionsProps } from "../lib"; import * as stepfunctions from 'aws-cdk-lib/aws-stepfunctions'; import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; @@ -309,6 +309,30 @@ test('Check for custom log group props', () => { }); }); +test('Confirm that CheckVpcProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + + const props: FargateToStepfunctionsProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + stateMachineProps: testStateMachineProps(stack), + existingVpc: defaults.getTestVpc(stack), + vpcProps: { ipAddresses: ec2.IpAddresses.cidr(testCidr) }, + }; + + const app = () => { + new FargateToStepfunctions(stack, 'test-construct', props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); + function createFargateConstructWithNewResources(stack: cdk.Stack, publicApi: boolean) { return new FargateToStepfunctions(stack, 'test-construct', { publicApi, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts index d9bb4f85a..a77015ea2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts @@ -130,7 +130,7 @@ test('check properties', () => { // -------------------------------------------------------------- // Test bad call with existingBucket and bucketProps // -------------------------------------------------------------- -test("Test bad call with existingBucket and bucketProps", () => { +test("Confirm CheckS3Props is being called", () => { // Stack const stack = new cdk.Stack(); @@ -154,7 +154,7 @@ test("Test bad call with existingBucket and bucketProps", () => { }); }; // Assertion - expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); + expect(app).toThrowError("Error - Either provide bucketProps or existingBucketObj, but not both.\n"); }); // -------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts index 42f7e8ff3..3e903a09c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts @@ -587,7 +587,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function // -------------------------------------------------------------- // Test bad call with existingVpc and deployVpc // -------------------------------------------------------------- -test("Test bad call with existingVpc and deployVpc", () => { +test("Confirm CheckVpcProps is called", () => { // Stack const stack = new cdk.Stack(); @@ -614,7 +614,7 @@ test("Test bad call with existingVpc and deployVpc", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); // NOTE: existingTableObj was omitted from the interface for this construct, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts index 5afb9a05c..d17c4e809 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts @@ -83,6 +83,7 @@ export class IotToS3 extends Construct { this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); defaults.CheckProps(props); + defaults.CheckS3Props(props); // Setup S3 Bucket if (!props.existingBucketInterface) { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/iot-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/iot-s3.test.ts index b14708f12..87dd4a033 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/iot-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/iot-s3.test.ts @@ -325,4 +325,26 @@ test('check for chaining of resource', () => { const template = Template.fromStack(stack); template.resourceCountIs('AWS::IoT::TopicRule', 2); template.resourceCountIs('AWS::S3::Bucket', 2); +}); + +test('Confirm CHeckS3Props is being called', () => { + const stack = new cdk.Stack(); + + const props: IotToS3Props = { + iotTopicRuleProps: { + topicRulePayload: { + ruleDisabled: false, + description: "process solutions constructs messages", + sql: "SELECT * FROM 'solutions/constructs'", + actions: [] + } + }, + bucketProps: {}, + existingBucketInterface: new s3.Bucket(stack, 'test-bucket', {}), + }; + const app = () => { + new IotToS3(stack, 'test-iot-s3-integration', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/lib/index.ts index 13a46e435..c6ed87fdc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/lib/index.ts @@ -103,6 +103,7 @@ export class IotToSqs extends Construct { constructor(scope: Construct, id: string, props: IotToSqsProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSqsProps(props); // Setup the dead letter queue, if applicable this.deadLetterQueue = defaults.buildDeadLetterQueue(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/iot-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/iot-sqs.test.ts index c4d6cb3f8..bc84424c7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/iot-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/iot-sqs.test.ts @@ -12,7 +12,7 @@ */ // Imports -import { Stack } from "aws-cdk-lib"; +import { Stack, RemovalPolicy } from "aws-cdk-lib"; import { IotToSqs, IotToSqsProps } from "../lib"; import { Template } from 'aws-cdk-lib/assertions'; import * as sqs from 'aws-cdk-lib/aws-sqs'; @@ -542,3 +542,27 @@ test('Pattern deployment with passing a FIFO queue (not supported by IoT)', () = expect(err.message).toBe('The IoT SQS action doesn\'t support Amazon SQS FIFO (First-In-First-Out) queues'); } }); + +test('Confirm CheckSqsProps is being called', () => { + // Initial Setup + const stack = new Stack(); + const props: IotToSqsProps = { + iotTopicRuleProps: { + topicRulePayload: { + ruleDisabled: false, + description: "Processing messages from IoT devices or factory machines", + sql: "SELECT * FROM 'test/topic/#'", + actions: [] + } + }, + queueProps: { + removalPolicy: RemovalPolicy.DESTROY, + }, + existingQueueObj: new sqs.Queue(stack, 'test', {}) + }; + + const app = () => { + new IotToSqs(stack, 'test-iot-sqs', props); + }; + expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts index c172d05b1..ac5449520 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts @@ -106,7 +106,7 @@ test('test kinesisFirehose override ', () => { // -------------------------------------------------------------- // Test bad call with existingBucket and bucketProps // -------------------------------------------------------------- -test("Test bad call with existingBucket and bucketProps", () => { +test("Confirm CheckS3Props is being called", () => { // Stack const stack = new Stack(); @@ -122,7 +122,7 @@ test("Test bad call with existingBucket and bucketProps", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError("Error - Either provide bucketProps or existingBucketObj, but not both.\n"); }); // -------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts index 9f01075f4..29074002e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts @@ -95,6 +95,7 @@ export class KinesisFirehoseToS3 extends Construct { this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); defaults.CheckProps(props); + defaults.CheckS3Props(props); const firehoseId = 'KinesisFirehose'; diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts index 53ec03ff2..1671ab5fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts @@ -194,10 +194,7 @@ test('check for no SSE encryption for KinesisFirehoseToS3', () => { }); }); -// -------------------------------------------------------------- -// Test bad call with existingBucket and bucketProps -// -------------------------------------------------------------- -test("Test bad call with existingBucket and bucketProps", () => { +test("Confirm that CheckS3Props is being called", () => { // Stack const stack = new cdk.Stack(); @@ -213,7 +210,7 @@ test("Test bad call with existingBucket and bucketProps", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError("Error - Either provide bucketProps or existingBucketObj, but not both.\n"); }); // -------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts index 5659bf6e1..0d435e207 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts @@ -237,4 +237,23 @@ test('s3 bucket with one content bucket and no logging bucket', () => { const template = Template.fromStack(stack); template.resourceCountIs("AWS::S3::Bucket", 1); -}); \ No newline at end of file +}); + +test("Confirm that CheckS3Props is being called", () => { + // Stack + const stack = new cdk.Stack(); + + const testBucket = new s3.Bucket(stack, 'test-bucket', {}); + + const app = () => { + // Helper declaration + new KinesisStreamsToKinesisFirehoseToS3(stack, "bad-s3-args", { + existingBucketObj: testBucket, + bucketProps: { + removalPolicy: cdk.RemovalPolicy.DESTROY + }, + }); + }; + // Assertion + expect(app).toThrowError("Error - Either provide bucketProps or existingBucketObj, but not both.\n"); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts index 2376bc92b..93497d06f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts @@ -92,6 +92,7 @@ export class LambdaToDynamoDB extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckDynamoDBProps(props); + defaults.CheckVpcProps(props); // Other permissions for constructs are accepted as arrays, turning tablePermissions into // an array to use the same validation function. @@ -100,10 +101,6 @@ export class LambdaToDynamoDB extends Construct { } if (props.deployVpc || props.existingVpc) { - if (props.deployVpc && props.existingVpc) { - throw new Error("More than 1 VPC specified in the properties"); - } - this.vpc = defaults.buildVpc(scope, { defaultVpcProps: defaults.DefaultIsolatedVpcProps(), existingVpc: props.existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts index ea878a52a..1afe7536c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts @@ -759,10 +759,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- -test("Test bad call with existingVpc and deployVpc", () => { +test("Confirm CheckVpcProps is called", () => { // Stack const stack = new cdk.Stack(); @@ -781,7 +778,7 @@ test("Test bad call with existingVpc and deployVpc", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); test('Test bad table permission', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts index dce8c4152..eded4d6eb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts @@ -93,6 +93,7 @@ export class LambdaToElasticachememcached extends Construct { ) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); if ((props.existingCache || props.existingLambdaObj) && (!props.existingVpc)) { throw Error('If providing an existing Cache or Lambda Function, you must also supply the associated existingVpc'); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts index 99c126081..f9206d8a9 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts @@ -282,7 +282,7 @@ test('Test for the proper self referencing security group', () => { }, }); }); -// test('', () => {}); + test("Test error from existingCache and no VPC", () => { const stack = new cdk.Stack(); @@ -370,3 +370,25 @@ test("Test error from trying to launch Redis", () => { expect(app).toThrowError("This construct can only launch memcached clusters"); }); + +test("Test error from existingCache and no VPC", () => { + const stack = new cdk.Stack(); + + const vpc = defaults.getTestVpc(stack); + + const app = () => { + new LambdaToElasticachememcached(stack, "testStack", { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: ".handler", + }, + vpcProps: {}, + existingVpc: vpc + }); + }; + + expect(app).toThrowError( + 'Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n' + ); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts index dffaf3625..89efeb10b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts @@ -108,6 +108,7 @@ export class LambdaToElasticSearchAndKibana extends Construct { constructor(scope: Construct, id: string, props: LambdaToElasticSearchAndKibanaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); if (props.vpcProps && !props.deployVpc) { throw new Error("Error - deployVpc must be true when defining vpcProps"); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts index 94ea22461..f110786b3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts @@ -567,4 +567,22 @@ function getDefaultTestLambdaProps(): lambda.FunctionProps { runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', }; -} \ No newline at end of file +} + +test('Confirm CheckVpcProps is being called', () => { + const stack = new cdk.Stack(); + + const app = () => { + new LambdaToElasticSearchAndKibana(stack, 'test-lambda-elasticsearch-kibana', { + lambdaFunctionProps: getDefaultTestLambdaProps(), + domainName: "test", + deployVpc: true, + vpcProps: { + vpcName: "existing-vpc-test" + }, + existingVpc: defaults.getTestVpc(stack), + }); + }; + + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts index d2f3815c2..be6edde78 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts @@ -87,12 +87,9 @@ export class LambdaToEventbridge extends Construct { constructor(scope: Construct, id: string, props: LambdaToEventbridgeProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); if (props.deployVpc || props.existingVpc) { - if (props.deployVpc && props.existingVpc) { - throw new Error("More than 1 VPC specified in the properties"); - } - this.vpc = defaults.buildVpc(scope, { defaultVpcProps: defaults.DefaultIsolatedVpcProps(), existingVpc: props.existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts index 93e167b64..4b5553ba9 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts @@ -73,9 +73,6 @@ const vpcConfig = { }, }; -// -------------------------------------------------------------- -// Tests minimal deployment with new Lambda function -// -------------------------------------------------------------- test('Test minimal deployment with new Lambda function', () => { // Stack const stack = new Stack(); @@ -121,10 +118,7 @@ test('Test minimal deployment with new Lambda function', () => { }); }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- -test("Test bad call with existingVpc and deployVpc", () => { +test("Confirm CheckVpcProps is being called", () => { // Stack const stack = new Stack(); @@ -134,7 +128,7 @@ test("Test bad call with existingVpc and deployVpc", () => { // Helper declaration new LambdaToEventbridge(stack, "lambda-to-eventbridge-stack", { lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_16_X, + runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, @@ -143,12 +137,9 @@ test("Test bad call with existingVpc and deployVpc", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); -// -------------------------------------------------------------- -// Test exception while passing existingEventBus & eventBusProps -// -------------------------------------------------------------- test("Test bad call with existingVpc and deployVpc", () => { // Stack const stack = new Stack(); @@ -213,9 +204,6 @@ test('Test deployment w/ existing eventbus', () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC without vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Stack const stack = new Stack(); @@ -245,9 +233,6 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC w/vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Stack const stack = new Stack(); @@ -353,8 +338,6 @@ test("Test minimal deployment with an existing VPC", () => { // -------------------------------------------------------------- // Test minimal deployment with an existing VPC and existing Lambda function not in a VPC // -// buildLambdaFunction should throw an error if the Lambda function is not -// attached to a VPC // -------------------------------------------------------------- test("Test minimal deployment with an existing VPC and existing Lambda function not in a VPC", () => { // Stack @@ -370,7 +353,8 @@ test("Test minimal deployment with an existing VPC and existing Lambda function // Helper declaration const app = () => { - // Helper declaration + // buildLambdaFunction should throw an error if the Lambda function is not + // attached to a VPC new LambdaToEventbridge(stack, "lambda-to-eventbridge-stack", { existingLambdaObj: testLambdaFunction, existingVpc: testVpc, @@ -382,9 +366,6 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }); -// ---------------------------------------------------------------------------------- -// Test lambda function custom environment variable and custom event bus permissions -// ---------------------------------------------------------------------------------- test('Test lambda function custom environment variable', () => { // Stack const stack = new Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts index e44f13a92..331edc378 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts @@ -105,6 +105,7 @@ export class LambdaToKendra extends Construct { constructor(scope: Construct, id: string, props: LambdaToKendraProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); if (props.kendraIndexProps && props.existingKendraIndexObj) { throw new Error('You may not provide both kendraIndexProps and existingKendraIndexObj'); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts index 988d5eb13..7f834f4d7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts @@ -11,9 +11,8 @@ * and limitations under the License. */ -import { LambdaToKendra } from "../lib"; +import { LambdaToKendra, LambdaToKendraProps } from "../lib"; import * as lambda from 'aws-cdk-lib/aws-lambda'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as kendra from 'aws-cdk-lib/aws-kendra'; import * as iam from 'aws-cdk-lib/aws-iam'; import * as cdk from "aws-cdk-lib"; @@ -445,39 +444,6 @@ test('Launch with existing lambda', () => { }); }); -test('Confirm error with existing vpc and vpc props', () => { - const stack = new cdk.Stack(); - const testBucketName = 'test-bucket-name22'; - - const lambdaProps: lambda.FunctionProps = { - code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_18_X, - handler: 'index.handler' - }; - - const app = () => { - new LambdaToKendra(stack, 'sample', { - existingVpc: defaults.getTestVpc(stack), - deployVpc: true, - vpcProps: { - ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16') - }, - lambdaFunctionProps: lambdaProps, - kendraDataSourcesProps: [{ - type: 'S3', - dataSourceConfiguration: { - s3Configuration: { - bucketName: testBucketName, - } - } - } - ], - }); - }; - - expect(app).toThrowError(/Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n/); -}); - test('Confirm error with data source with no bucket name', () => { const stack = new cdk.Stack(); @@ -1038,3 +1004,45 @@ test('Test with custom environment variable name', () => { }); }); + +test('Confirm CheckVpcProps is being called', () => { + const stack = new cdk.Stack(); + const testFunctionName = 'test-function-name24334'; + const testBucketName = 'test-bucket-name12344'; + + const vpc = defaults.buildVpc(stack, { + defaultVpcProps: defaults.DefaultIsolatedVpcProps(), + constructVpcProps: { + enableDnsHostnames: true, + enableDnsSupport: true, + }, + }); + + const lambdaProps: lambda.FunctionProps = { + functionName: testFunctionName, + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }; + + const props: LambdaToKendraProps = { + lambdaFunctionProps: lambdaProps, + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: testBucketName, + } + } + } + ], + deployVpc: true, + existingVpc: vpc + }; + + const app = () => { + new LambdaToKendra(stack, 'sample', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts index 6971f5946..350cdbbc1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts @@ -83,6 +83,7 @@ export class LambdaToKinesisFirehose extends Construct { constructor(scope: Construct, id: string, props: LambdaToKinesisFirehoseProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); if (!props.deployVpc && props.vpcProps) { throw new Error('Error - If deployVpc is not true, then vpcProps is ignored'); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts index e049b30fb..fb02e6b8d 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts @@ -242,3 +242,32 @@ test('Test fail Vpc check with vpcProps yet deployVpc is undefined', () => { // Assertion expect(app).toThrowError('Error - If deployVpc is not true, then vpcProps is ignored'); }); + +test('Confirm CheckVpcProps() is being called', () => { + const stack = new cdk.Stack(); + const destination = GetTestFirehoseDestination(stack, 'test-destination'); + + const vpc = defaults.buildVpc(stack, { + defaultVpcProps: defaults.DefaultIsolatedVpcProps(), + constructVpcProps: { + enableDnsHostnames: true, + enableDnsSupport: true, + }, + }); + + const app = () => { + // Helper declaration + new LambdaToKinesisFirehose(stack, 'test-lambda-kinesisfirehose', { + existingKinesisFirehose: destination.kinesisFirehose, + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }, + deployVpc: true, + existingVpc: vpc + }); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts index 06d6acbd1..aa8d3a699 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts @@ -96,6 +96,7 @@ export class LambdaToKinesisStreams extends Construct { constructor(scope: Construct, id: string, props: LambdaToKinesisStreamsProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); // Setup the VPC if (props.deployVpc || props.existingVpc) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts index 60c375174..5c7312e48 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts @@ -549,4 +549,31 @@ function verifyLambdaFunctionVpcProps(template: Template, vpcId: string, subnetT EnableDnsHostnames: true, EnableDnsSupport: true, }); -} \ No newline at end of file +} + +test('Confirm CheckVpcProps() is being called', () => { + const stack = new cdk.Stack(); + + const vpc = defaults.buildVpc(stack, { + defaultVpcProps: defaults.DefaultIsolatedVpcProps(), + constructVpcProps: { + enableDnsHostnames: true, + enableDnsSupport: true, + }, + }); + + const app = () => { + // Helper declaration + new LambdaToKinesisStreams(stack, 'test-lambda-kinesisstreams', { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler' + }, + deployVpc: true, + existingVpc: vpc + }); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts index af3bee054..9eda22c10 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts @@ -108,6 +108,7 @@ export class LambdaToOpenSearch extends Construct { constructor(scope: Construct, id: string, props: LambdaToOpenSearchProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); if (props.vpcProps && !props.deployVpc) { throw new Error("Error - deployVpc must be true when defining vpcProps"); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts index 47013d07c..89ed23f15 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts @@ -600,3 +600,28 @@ test('Test error for missing existingLambdaObj or lambdaFunctionProps', () => { expect(e).toBeInstanceOf(Error); } }); + +test('Confirm CheckVpcProps is being called', () => { + const stack = new cdk.Stack(); + const vpc = defaults.buildVpc(stack, { + defaultVpcProps: defaults.DefaultIsolatedVpcProps(), + constructVpcProps: { + enableDnsHostnames: true, + enableDnsSupport: true, + }, + }); + + const app = () => { + new LambdaToOpenSearch(stack, 'test-lambda-opensearch', { + lambdaFunctionProps: getDefaultTestLambdaProps(), + openSearchDomainName: "test", + vpcProps: { + vpcName: "existing-vpc-test" + }, + deployVpc: true, + existingVpc: vpc + }); + }; + + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts index aaf234198..7db870a07 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts @@ -115,6 +115,8 @@ export class LambdaToS3 extends Construct { this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); defaults.CheckProps(props); + defaults.CheckS3Props(props); + defaults.CheckVpcProps(props); if (props.bucketPermissions) { defaults.CheckListValues(['Delete', 'Put', 'Read', 'ReadWrite', 'Write'], props.bucketPermissions, 'bucket permission'); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts index a8c51de75..2ddabc047 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts @@ -17,12 +17,9 @@ import * as lambda from "aws-cdk-lib/aws-lambda"; import * as ec2 from "aws-cdk-lib/aws-ec2"; import * as s3 from "aws-cdk-lib/aws-s3"; import { LambdaToS3 } from '../lib'; -import { CreateScrapBucket } from '@aws-solutions-constructs/core'; +import * as defaults from '@aws-solutions-constructs/core'; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Test the getter methods -// -------------------------------------------------------------- test('Test the properties', () => { // Stack const stack = new Stack(); @@ -44,9 +41,6 @@ test('Test the properties', () => { expect(pattern.s3LoggingBucket !== null); }); -// -------------------------------------------------------------- -// Test the bucketProps override -// -------------------------------------------------------------- test('Test the bucketProps override', () => { // Stack const stack = new Stack(); @@ -69,9 +63,6 @@ test('Test the bucketProps override', () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC without vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Stack const stack = new Stack(); @@ -120,9 +111,6 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC w/vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Stack const stack = new Stack(); @@ -177,9 +165,6 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC", () => { // Stack const stack = new Stack(); @@ -223,12 +208,6 @@ test("Test minimal deployment with an existing VPC", () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC and existing Lambda function not in a VPC -// -// buildLambdaFunction should throw an error if the Lambda function is not -// attached to a VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC and existing Lambda function not in a VPC", () => { // Stack const stack = new Stack(); @@ -243,7 +222,8 @@ test("Test minimal deployment with an existing VPC and existing Lambda function // Helper declaration const app = () => { - // Helper declaration + // buildLambdaFunction should throw an error if the Lambda function is not + // attached to a VPC new LambdaToS3(stack, "lambda-to-s3-stack", { existingLambdaObj: testLambdaFunction, existingVpc: testVpc, @@ -255,40 +235,12 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- -test("Test bad call with existingVpc and deployVpc", () => { - // Stack - const stack = new Stack(); - - const testVpc = new ec2.Vpc(stack, "test-vpc", {}); - - const app = () => { - // Helper declaration - new LambdaToS3(stack, "lambda-to-s3-stack", { - lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_16_X, - handler: "index.handler", - code: lambda.Code.fromAsset(`${__dirname}/lambda`), - }, - existingVpc: testVpc, - deployVpc: true, - }); - }; - // Assertion - expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); -}); - -// -------------------------------------------------------------- -// Test lambda function custom environment variable -// -------------------------------------------------------------- test('Test lambda function custom environment variable', () => { // Stack const stack = new Stack(); // Helper declaration - const existingBucket = CreateScrapBucket(stack, {}); + const existingBucket = defaults.CreateScrapBucket(stack, {}); const mybucket: s3.IBucket = s3.Bucket.fromBucketName(stack, 'mybucket', existingBucket.bucketName); new LambdaToS3(stack, 'lambda-to-s3-stack', { existingBucketObj: mybucket, @@ -319,7 +271,7 @@ test('Test lambda function custom environment variable', () => { // -------------------------------------------------------------- // Test bad call with existingBucket and bucketProps // -------------------------------------------------------------- -test("Test bad call with existingBucket and bucketProps", () => { +test("Confirm that CheckS3Props is being called", () => { // Stack const stack = new Stack(); @@ -340,7 +292,7 @@ test("Test bad call with existingBucket and bucketProps", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); }); test('Test that CheckProps() is flagging errors correctly', () => { @@ -371,9 +323,6 @@ test('Test that CheckProps() is flagging errors correctly', () => { }); -// -------------------------------------------------------------- -// s3 bucket with bucket, loggingBucket, and auto delete objects -// -------------------------------------------------------------- test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { const stack = new Stack(); @@ -408,9 +357,6 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); }); -// -------------------------------------------------------------- -// s3 bucket with one content bucket and no logging bucket -// -------------------------------------------------------------- test('s3 bucket with one content bucket and no logging bucket', () => { const stack = new Stack(); @@ -452,3 +398,33 @@ test('Test bad bucket permission', () => { expect(alb).toThrowError('Invalid bucket permission submitted - Reed'); }); + +test("Confirm that CheckVpcProps is being called", () => { + // Stack + const stack = new Stack(); + const vpc = defaults.buildVpc(stack, { + defaultVpcProps: defaults.DefaultIsolatedVpcProps(), + constructVpcProps: { + enableDnsHostnames: true, + enableDnsSupport: true, + }, + }); + + const app = () => { + // Helper declaration + new LambdaToS3(stack, "bad-s3-args", { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + bucketProps: { + removalPolicy: RemovalPolicy.DESTROY + }, + deployVpc: true, + existingVpc: vpc, + }); + }; + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts index a59c19713..720d316cc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts @@ -106,11 +106,9 @@ export class LambdaToSagemakerEndpoint extends Construct { constructor(scope: Construct, id: string, props: LambdaToSagemakerEndpointProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); if (props.deployVpc || props.existingVpc) { - if (props.deployVpc && props.existingVpc) { - throw new Error('More than 1 VPC specified in the properties'); - } // create the VPC this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts index b2b2599b2..7de4618fc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts @@ -360,7 +360,7 @@ test('Test for error with existingLambdaObj/lambdaFunctionProps=undefined (not s // -------------------------------------------------------------------- // Test for error with (props.deployVpc && props.existingVpc) is true // -------------------------------------------------------------------- -test('Test for error with (props.deployVpc && props.existingVpc) is true', () => { +test('confirm CheckVpcProps is called', () => { // Initial Setup const stack = new Stack(); @@ -384,6 +384,13 @@ test('Test for error with (props.deployVpc && props.existingVpc) is true', () => modelDataUrl: 's3:////model.tar.gz', }, }, + lambdaFunctionProps: { + runtime: lambda.Runtime.PYTHON_3_8, + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + handler: 'index.handler', + timeout: Duration.minutes(5), + memorySize: 128, + }, deployVpc: true, existingVpc: vpc, }; @@ -391,7 +398,7 @@ test('Test for error with (props.deployVpc && props.existingVpc) is true', () => new LambdaToSagemakerEndpoint(stack, 'test-lambda-sagemaker', constructProps); }; // Assertion 1 - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); // ---------------------------------------------------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts index 79060aed8..9d32421e1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts @@ -93,11 +93,9 @@ export class LambdaToSecretsmanager extends Construct { constructor(scope: Construct, id: string, props: LambdaToSecretsmanagerProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); if (props.deployVpc || props.existingVpc) { - if (props.deployVpc && props.existingVpc) { - throw new Error("More than 1 VPC specified in the properties"); - } this.vpc = defaults.buildVpc(scope, { defaultVpcProps: defaults.DefaultIsolatedVpcProps(), diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts index e693e5891..5855b3e0f 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts @@ -20,9 +20,6 @@ import { LambdaToSecretsmanager } from '../lib'; import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from "@aws-solutions-constructs/core"; -// -------------------------------------------------------------- -// Test the getter methods -// -------------------------------------------------------------- test('Test the properties', () => { // Stack const stack = new Stack(); @@ -43,9 +40,6 @@ test('Test the properties', () => { expect(secret).toBeDefined(); }); -// -------------------------------------------------------------- -// Test deployment w/ existing secret -// -------------------------------------------------------------- test('Test deployment w/ existing secret', () => { // Stack const stack = new Stack(); @@ -68,9 +62,6 @@ test('Test deployment w/ existing secret', () => { expect(pattern.secret).toBe(existingSecret); }); -// -------------------------------------------------------------- -// Test deployment w/ existing function -// -------------------------------------------------------------- test('Test deployment w/ existing function', () => { // Stack const stack = new Stack(); @@ -95,9 +86,6 @@ test('Test deployment w/ existing function', () => { expect(pattern.lambdaFunction).toBe(existingFunction); }); -// -------------------------------------------------------------- -// Test minimal deployment with write access to Secret -// -------------------------------------------------------------- test('Test minimal deployment write access to Secret', () => { // Stack const stack = new Stack(); @@ -119,9 +107,6 @@ test('Test minimal deployment write access to Secret', () => { }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC without vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Stack const stack = new Stack(); @@ -171,9 +156,6 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC w/vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Stack const stack = new Stack(); @@ -229,9 +211,6 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC", () => { // Stack const stack = new Stack(); @@ -276,13 +255,7 @@ test("Test minimal deployment with an existing VPC", () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC and existing Lambda function not in a VPC -// -// buildLambdaFunction should throw an error if the Lambda function is not -// attached to a VPC -// -------------------------------------------------------------- -test("Test minimal deployment with an existing VPC and existing Lambda function not in a VPC", () => { +test("Check error when existing lambda function is not in VPC and construct is in VPC", () => { // Stack const stack = new Stack(); @@ -296,7 +269,8 @@ test("Test minimal deployment with an existing VPC and existing Lambda function // Helper declaration const app = () => { - // Helper declaration + // buildLambdaFunction should throw an error if the Lambda function is not + // attached to a VPC new LambdaToSecretsmanager(stack, "lambda-to-secretsmanager-stack", { existingLambdaObj: testLambdaFunction, existingVpc: testVpc, @@ -309,10 +283,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- -test("Test bad call with existingVpc and deployVpc", () => { +test("Confirm CheckVpcProps is called", () => { // Stack const stack = new Stack(); @@ -332,12 +303,9 @@ test("Test bad call with existingVpc and deployVpc", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); -// -------------------------------------------------------------- -// Test lambda function custom environment variable -// -------------------------------------------------------------- test('Test lambda function custom environment variable', () => { // Stack const stack = new Stack(); @@ -372,9 +340,6 @@ test('Test lambda function custom environment variable', () => { }); }); -// -------------------------------------------------------------- -// Test overriding secretProps to pass a customer provided CMK -// -------------------------------------------------------------- test('Test overriding secretProps to pass a customer provided CMK', () => { // Stack const stack = new Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts index 765e36c99..16839ca9e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts @@ -115,6 +115,7 @@ export class LambdaToSns extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckSnsProps(props); + defaults.CheckVpcProps(props); if (props.deployVpc || props.existingVpc) { this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts index 145c7fbf2..0b5285e50 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts @@ -20,9 +20,6 @@ import * as ec2 from "aws-cdk-lib/aws-ec2"; import { LambdaToSns, LambdaToSnsProps } from '../lib'; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Test deployment with new Lambda function -// -------------------------------------------------------------- test('Test deployment with new Lambda function', () => { // Stack const stack = new Stack(); @@ -80,9 +77,6 @@ test('Test deployment with new Lambda function', () => { }); }); -// -------------------------------------------------------------- -// Test deployment with existing existingTopicObj -// -------------------------------------------------------------- test('Test deployment with existing existingTopicObj', () => { // Stack const stack = new Stack(); @@ -110,9 +104,6 @@ test('Test deployment with existing existingTopicObj', () => { }); }); -// -------------------------------------------------------------- -// Test deployment with imported encryption key -// -------------------------------------------------------------- test('override topicProps', () => { const stack = new Stack(); @@ -135,9 +126,6 @@ test('override topicProps', () => { }); }); -// -------------------------------------------------------------- -// Test the getter methods -// -------------------------------------------------------------- test('Test the properties', () => { // Stack const stack = new Stack(); @@ -157,9 +145,6 @@ test('Test the properties', () => { expect(topic).toBeDefined(); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC without vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Stack const stack = new Stack(); @@ -208,9 +193,6 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC w/vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Stack const stack = new Stack(); @@ -265,9 +247,6 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC", () => { // Stack const stack = new Stack(); @@ -311,12 +290,6 @@ test("Test minimal deployment with an existing VPC", () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC and existing Lambda function not in a VPC -// -// buildLambdaFunction should throw an error if the Lambda function is not -// attached to a VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC and existing Lambda function not in a VPC", () => { // Stack const stack = new Stack(); @@ -331,7 +304,8 @@ test("Test minimal deployment with an existing VPC and existing Lambda function // Helper declaration const app = () => { - // Helper declaration + // buildLambdaFunction should throw an error if the Lambda function is not + // attached to a VPC new LambdaToSns(stack, "lambda-to-sns-stack", { existingLambdaObj: testLambdaFunction, existingVpc: testVpc, @@ -343,34 +317,6 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- -test("Test bad call with existingVpc and deployVpc", () => { - // Stack - const stack = new Stack(); - - const testVpc = new ec2.Vpc(stack, "test-vpc", {}); - - const app = () => { - // Helper declaration - new LambdaToSns(stack, "lambda-to-sns-stack", { - lambdaFunctionProps: { - runtime: lambda.Runtime.NODEJS_16_X, - handler: "index.handler", - code: lambda.Code.fromAsset(`${__dirname}/lambda`), - }, - existingVpc: testVpc, - deployVpc: true, - }); - }; - // Assertion - expect(app).toThrowError(); -}); - -// -------------------------------------------------------------- -// Test lambda function custom environment variable -// -------------------------------------------------------------- test('Test lambda function custom environment variable', () => { // Stack const stack = new Stack(); @@ -567,7 +513,7 @@ test('Topic is encrypted with customer managed KMS Key when enable encryption fl }); }); -test('Error is thrown when conflicting VPC information is provided', () => { +test('Confirm CheckVpcProps is called', () => { const stack = new Stack(); const app = () => { @@ -577,7 +523,7 @@ test('Error is thrown when conflicting VPC information is provided', () => { }); }; - expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.'); + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); test('Test that CheckSnsProps is getting called', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts index b95479002..e845a9d6e 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts @@ -14,14 +14,12 @@ // Imports import { Stack } from "aws-cdk-lib"; import * as lambda from "aws-cdk-lib/aws-lambda"; +import * as sqs from "aws-cdk-lib/aws-sqs"; import * as ec2 from "aws-cdk-lib/aws-ec2"; import * as defaults from '@aws-solutions-constructs/core'; import { LambdaToSqsToLambda, LambdaToSqsToLambdaProps } from '../lib'; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Test minimal deployment -// -------------------------------------------------------------- test('Test minimal deployment', () => { // Stack const stack = new Stack(); @@ -117,9 +115,6 @@ test('Test minimal deployment', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ existing producer function -// -------------------------------------------------------------- test('Test deployment w/ existing producer function', () => { // Stack const stack = new Stack(); @@ -155,9 +150,6 @@ test('Test deployment w/ existing producer function', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ existing consumer function -// -------------------------------------------------------------- test('Test deployment w/ existing consumer function', () => { // Stack const stack = new Stack(); @@ -193,9 +185,6 @@ test('Test deployment w/ existing consumer function', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ existing queue -// -------------------------------------------------------------- test('Test deployment w/ existing queue', () => { // Stack const stack = new Stack(); @@ -230,9 +219,6 @@ test('Test deployment w/ existing queue', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ DLQ explicitly disabled -// -------------------------------------------------------------- test('Test deployment w/ DLQ explicitly disabled', () => { // Stack const stack = new Stack(); @@ -261,9 +247,6 @@ test('Test deployment w/ DLQ explicitly disabled', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ DLQ explicitly enabled and w/ MRC override -// -------------------------------------------------------------- test('Test deployment w/ DLQ explicitly enabled and w/ MRC override', () => { // Stack const stack = new Stack(); @@ -299,9 +282,6 @@ test('Test deployment w/ DLQ explicitly enabled and w/ MRC override', () => { }); }); -// -------------------------------------------------------------- -// Test overrides for producer and consumer functions -// -------------------------------------------------------------- test('Test overrides for producer and consumer functions', () => { // Stack const stack = new Stack(); @@ -333,9 +313,6 @@ test('Test overrides for producer and consumer functions', () => { }); }); -// -------------------------------------------------------------- -// Test the public pattern props -// -------------------------------------------------------------- test('Test the public pattern props', () => { // Stack const stack = new Stack(); @@ -365,9 +342,6 @@ test('Test the public pattern props', () => { expect(pattern.consumerLambdaFunction).toBeDefined(); }); -// -------------------------------------------------------------- -// Test lambda function custom environment variable -// -------------------------------------------------------------- test('Test lambda function custom environment variable', () => { // Stack const stack = new Stack(); @@ -405,9 +379,6 @@ test('Test lambda function custom environment variable', () => { }); }); -// -------------------------------------------------------------- -// Pattern deployment w/ batch size -// -------------------------------------------------------------- test('Pattern deployment w/ batch size', () => { const stack = new Stack(); const props: LambdaToSqsToLambdaProps = { @@ -435,9 +406,6 @@ test('Pattern deployment w/ batch size', () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC without vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Stack const stack = new Stack(); @@ -493,9 +461,6 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC w/vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Stack const stack = new Stack(); @@ -557,9 +522,6 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC", () => { // Stack const stack = new Stack(); @@ -610,9 +572,6 @@ test("Test minimal deployment with an existing VPC", () => { }); }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- test("Test bad call with existingVpc and deployVpc", () => { // Stack const stack = new Stack(); @@ -640,4 +599,30 @@ test("Test bad call with existingVpc and deployVpc", () => { }; // Assertion expect(app).toThrowError(); -}); \ No newline at end of file +}); + +test('Confirm CheckSqsProps is being called', () => { + // NOTE: CheckSqsProps is called from both lambda-sqs and sqs-lambda internally + // Stack + const stack = new Stack(); + // Helper declaration + const props: LambdaToSqsToLambdaProps = { + producerLambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`) + }, + consumerLambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`) + }, + queueProps: {}, + existingQueueObj: new sqs.Queue(stack, 'test', {}) + }; + + const app = () => { + new LambdaToSqsToLambda(stack, 'test-eventbridge-sqs', props); + }; + expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts index cfa860bb0..9ab738b04 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts @@ -132,6 +132,8 @@ export class LambdaToSqs extends Construct { constructor(scope: Construct, id: string, props: LambdaToSqsProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSqsProps(props); + defaults.CheckVpcProps(props); if (props.deployVpc || props.existingVpc) { this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts index 43e48f02e..d71a285bc 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts @@ -12,16 +12,14 @@ */ // Imports -import { Stack } from "aws-cdk-lib"; +import { Stack, RemovalPolicy } from "aws-cdk-lib"; +import * as sqs from 'aws-cdk-lib/aws-sqs'; import * as kms from 'aws-cdk-lib/aws-kms'; import * as lambda from "aws-cdk-lib/aws-lambda"; import * as ec2 from "aws-cdk-lib/aws-ec2"; import { LambdaToSqs } from '../lib'; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Test the getter methods -// -------------------------------------------------------------- test('Test the properties', () => { // Stack const stack = new Stack(); @@ -44,9 +42,6 @@ test('Test the properties', () => { expect(dlq).toBeDefined(); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC without vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Stack const stack = new Stack(); @@ -95,9 +90,6 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC w/vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Stack const stack = new Stack(); @@ -152,9 +144,6 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC", () => { // Stack const stack = new Stack(); @@ -198,12 +187,6 @@ test("Test minimal deployment with an existing VPC", () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC and existing Lambda function not in a VPC -// -// buildLambdaFunction should throw an error if the Lambda function is not -// attached to a VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC and existing Lambda function not in a VPC", () => { // Stack const stack = new Stack(); @@ -230,10 +213,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- -test("Test bad call with existingVpc and deployVpc", () => { +test("Confirm CheckVpcProps is called", () => { // Stack const stack = new Stack(); @@ -252,12 +232,9 @@ test("Test bad call with existingVpc and deployVpc", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); -// -------------------------------------------------------------- -// Test lambda function custom environment variable -// -------------------------------------------------------------- test('Test lambda function custom environment variable', () => { // Stack const stack = new Stack(); @@ -428,19 +405,6 @@ test('Queue is encrypted with customer managed KMS Key when enable encryption fl }); }); -test('Error is thrown when conflicting VPC information is provided', () => { - const stack = new Stack(); - - const app = () => { - new LambdaToSqs(stack, 'test-construct', { - existingVpc: new ec2.Vpc(stack, "test-vpc", {}), - deployVpc: true - }); - }; - - expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.'); -}); - test('Queue purging flag grants correct permissions', () => { const stack = new Stack(); @@ -523,4 +487,26 @@ test('Queue purging flag grants correct permissions', () => { } ] }); -}); \ No newline at end of file +}); + +test('Confirm CheckSqsProps is being called', () => { + // Stack + const stack = new Stack(); + // Helper declaration + const props = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`) + }, + queueProps: { + removalPolicy: RemovalPolicy.DESTROY, + }, + existingQueueObj: new sqs.Queue(stack, 'test', {}) + }; + + const app = () => { + new LambdaToSqs(stack, 'test-eventbridge-sqs', props); + }; + expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts index 01d038773..ee603b8ca 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts @@ -95,6 +95,7 @@ export class LambdaToSsmstringparameter extends Construct { constructor(scope: Construct, id: string, props: LambdaToSsmstringparameterProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); // This should have been an array, we will make it an array for validation if (props.stringParameterPermissions) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts index db3f570b9..9be560701 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts @@ -20,9 +20,6 @@ import { Template } from 'aws-cdk-lib/assertions'; import { StringParameter } from "aws-cdk-lib/aws-ssm"; import * as defaults from "@aws-solutions-constructs/core"; -// -------------------------------------------------------------- -// Test lambda function custom environment variable -// -------------------------------------------------------------- test('Test lambda function custom environment variable', () => { // Stack const stack = new Stack(); @@ -57,9 +54,6 @@ test('Test lambda function custom environment variable', () => { }); }); -// -------------------------------------------------------------- -// Test the getter methods -// -------------------------------------------------------------- test('Test the properties', () => { // Stack const stack = new Stack(); @@ -80,9 +74,6 @@ test('Test the properties', () => { expect(stringParam).toBeDefined(); }); -// -------------------------------------------------------------- -// Test deployment w/ existing String Parameter -// -------------------------------------------------------------- test('Test deployment w/ existing String Parameter', () => { // Stack const stack = new Stack(); @@ -107,9 +98,6 @@ test('Test deployment w/ existing String Parameter', () => { expect(pattern.stringParameter).toBe(existingStringParam); }); -// -------------------------------------------------------------- -// Test deployment w/ existing function -// -------------------------------------------------------------- test('Test deployment w/ existing function', () => { // Stack const stack = new Stack(); @@ -135,9 +123,6 @@ test('Test deployment w/ existing function', () => { expect(pattern.lambdaFunction).toBe(existingFunction); }); -// -------------------------------------------------------------- -// Test minimal deployment with write access to String Parameter. -// -------------------------------------------------------------- test('Test minimal deployment write access to String Parameter ', () => { // Stack const stack = new Stack(); @@ -160,9 +145,6 @@ test('Test minimal deployment write access to String Parameter ', () => { }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC without vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Stack const stack = new Stack(); @@ -212,9 +194,6 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC w/vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Stack const stack = new Stack(); @@ -270,9 +249,6 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC", () => { // Stack const stack = new Stack(); @@ -317,12 +293,6 @@ test("Test minimal deployment with an existing VPC", () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC and existing Lambda function not in a VPC -// -// buildLambdaFunction should throw an error if the Lambda function is not -// attached to a VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC and existing Lambda function not in a VPC", () => { // Stack const stack = new Stack(); @@ -337,7 +307,8 @@ test("Test minimal deployment with an existing VPC and existing Lambda function // Helper declaration const app = () => { - // Helper declaration + // buildLambdaFunction should throw an error if the Lambda function is not + // attached to a VPC new LambdaToSsmstringparameter(stack, "lambda-to-ssm-stack", { existingLambdaObj: testLambdaFunction, existingVpc: testVpc, @@ -350,10 +321,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- -test("Test bad call with existingVpc and deployVpc", () => { +test("Confirm that CheckVpcProps is called", () => { // Stack const stack = new Stack(); @@ -373,7 +341,7 @@ test("Test bad call with existingVpc and deployVpc", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); test("Test bad call with invalid string parameter permission", () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts index 9f6406460..6761f39f9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts @@ -98,12 +98,10 @@ export class LambdaToStepfunctions extends Construct { constructor(scope: Construct, id: string, props: LambdaToStepfunctionsProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckVpcProps(props); // Setup vpc if (props.deployVpc || props.existingVpc) { - if (props.deployVpc && props.existingVpc) { - throw new Error("More than 1 VPC specified in the properties"); - } this.vpc = defaults.buildVpc(scope, { defaultVpcProps: defaults.DefaultIsolatedVpcProps(), diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts index cf9fbc33b..5bbd23157 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts @@ -20,9 +20,6 @@ import * as ec2 from "aws-cdk-lib/aws-ec2"; import { LambdaToStepfunctions } from '../lib'; import { Template } from "aws-cdk-lib/assertions"; -// -------------------------------------------------------------- -// Test deployment with new Lambda function -// -------------------------------------------------------------- test('Test deployment with new Lambda function', () => { // Stack const stack = new Stack(); @@ -90,9 +87,6 @@ test('Test deployment with existing Lambda function', () => { }); }); -// -------------------------------------------------------------- -// Test invocation permissions -// -------------------------------------------------------------- test('Test invocation permissions', () => { // Stack const stack = new Stack(); @@ -140,9 +134,6 @@ test('Test invocation permissions', () => { }); }); -// -------------------------------------------------------------- -// Test the properties -// -------------------------------------------------------------- test('Test the properties', () => { // Stack const stack = new Stack(); @@ -173,9 +164,6 @@ test('Test the properties', () => { expect(pattern.stateMachineLogGroup).toBeDefined(); }); -// -------------------------------------------------------------- -// Test the properties -// -------------------------------------------------------------- test('Test the properties with no CW Alarms', () => { // Stack const stack = new Stack(); @@ -204,9 +192,6 @@ test('Test the properties with no CW Alarms', () => { expect(pattern.stateMachineLogGroup).toBeDefined(); }); -// -------------------------------------------------------------- -// Test lambda function custom environment variable -// -------------------------------------------------------------- test('Test lambda function custom environment variable', () => { // Stack const stack = new Stack(); @@ -241,9 +226,6 @@ test('Test lambda function custom environment variable', () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC without vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Stack const stack = new Stack(); @@ -357,9 +339,6 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC", () => { // Stack const stack = new Stack(); @@ -406,12 +385,6 @@ test("Test minimal deployment with an existing VPC", () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC and existing Lambda function not in a VPC -// -// buildLambdaFunction should throw an error if the Lambda function is not -// attached to a VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC and existing Lambda function not in a VPC", () => { // Stack const stack = new Stack(); @@ -427,7 +400,8 @@ test("Test minimal deployment with an existing VPC and existing Lambda function // Helper declaration const app = () => { - // Helper declaration + // buildLambdaFunction should throw an error if the Lambda function is not + // attached to a VPC new LambdaToStepfunctions(stack, "lambda-to-stepfunctions-stack", { existingLambdaObj: testLambdaFunction, stateMachineProps: { @@ -442,10 +416,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- -test("Test bad call with existingVpc and deployVpc", () => { +test("Confirm CheckVpcProps is called", () => { // Stack const stack = new Stack(); const startState = new stepfunctions.Pass(stack, 'StartState'); @@ -467,5 +438,5 @@ test("Test bad call with existingVpc and deployVpc", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts index ba1d1a59e..e65cc9743 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts @@ -90,6 +90,7 @@ export class S3ToLambda extends Construct { this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); defaults.CheckProps(props); + defaults.CheckS3Props(props); let bucket: s3.Bucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts index 6a1a3ea8d..e09f9f0a3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts @@ -43,10 +43,7 @@ test('check properties', () => { expect(construct.s3LoggingBucket !== null); }); -// -------------------------------------------------------------- -// Test bad call with existingBucket and bucketProps -// -------------------------------------------------------------- -test("Test bad call with existingBucket and bucketProps", () => { +test("Confirm CheckS3Props is being called", () => { // Stack const stack = new cdk.Stack(); @@ -55,6 +52,11 @@ test("Test bad call with existingBucket and bucketProps", () => { const app = () => { // Helper declaration new S3ToLambda(stack, "bad-s3-args", { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler' + }, existingBucketObj: testBucket, bucketProps: { removalPolicy: cdk.RemovalPolicy.DESTROY @@ -62,12 +64,9 @@ test("Test bad call with existingBucket and bucketProps", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); }); -// -------------------------------------------------------------- -// s3 bucket with bucket, loggingBucket, and auto delete objects -// -------------------------------------------------------------- test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { const stack = new cdk.Stack(); @@ -102,9 +101,6 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); }); -// -------------------------------------------------------------- -// s3 bucket with one content bucket and no logging bucket -// -------------------------------------------------------------- test('s3 bucket with one content bucket and no logging bucket', () => { const stack = new cdk.Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts index 207622f86..0df5c0718 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts @@ -130,6 +130,8 @@ export class S3ToSns extends Construct { this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); defaults.CheckProps(props); + defaults.CheckSnsProps(props); + defaults.CheckS3Props(props); // If the enableEncryptionWithCustomerManagedKey is undefined, default it to true const enableEncryptionParam = props.enableEncryptionWithCustomerManagedKey === false ? false : true; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts index 7a45685ad..b1bbaa8f5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts @@ -254,4 +254,41 @@ test('Construct does not override unencrypted topic when passed in existingTopic template.hasResourceProperties("AWS::SNS::Topic", { TopicName: 'existing-topic-name' }); -}); \ No newline at end of file +}); + +test('Confirm CheckSnsProps is being called', () => { + const stack = new Stack(); + + const topic = new sns.Topic(stack, "existing-topic-obj", { + topicName: 'existing-topic-obj' + }); + + const app = () => { + new S3ToSns(stack, 'test-s3-sns', { + existingTopicObj: topic, + topicProps: { + topicName: 'topic-name' + }, + }); + }; + + // Assertion + expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); +}); + +test('Confirm CheckS3Props is being called', () => { + const stack = new Stack(); + + const app = () => { + new S3ToSns(stack, 'test-s3-sns', { + topicProps: { + topicName: 'topic-name' + }, + bucketProps: {}, + existingBucketObj: new s3.Bucket(stack, 'test-bucket', {}), + }); + }; + + // Assertion + expect(app).toThrowError(/Error - Either provide bucketProps or existingBucketObj, but not both.\n/); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts index cd41a50e0..8a69d3e1e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts @@ -140,6 +140,8 @@ export class S3ToSqs extends Construct { this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); defaults.CheckProps(props); + defaults.CheckSqsProps(props); + defaults.CheckS3Props(props); let bucket: s3.Bucket; let enableEncryptionParam = props.enableEncryptionWithCustomerManagedKey; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts index 34521e7ce..f9a423590 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts @@ -20,9 +20,6 @@ import * as s3 from 'aws-cdk-lib/aws-s3'; import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; -// -------------------------------------------------------------- -// Test the getter methods -// -------------------------------------------------------------- test('Test getter methods', () => { // Initial Setup const stack = new Stack(); @@ -43,9 +40,6 @@ test('Test getter methods', () => { expect(app.s3Bucket !== null); }); -// -------------------------------------------------------------- -// Test deployment w/ existing queue -// -------------------------------------------------------------- test('Test deployment w/ existing queue', () => { // Stack const stack = new Stack(); @@ -77,9 +71,6 @@ test('Test deployment w/ existing queue', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ existing s3 Bucket -// -------------------------------------------------------------- test('Test deployment w/ existing Bucket', () => { // Stack const stack = new Stack(); @@ -108,9 +99,6 @@ test('Test deployment w/ existing Bucket', () => { }); }); -// -------------------------------------------------------------- -// Pattern deployment w/ bucket block public access override -// -------------------------------------------------------------- test('Pattern deployment w/ bucket versioning turned off', () => { const stack = new Stack(); const props: S3ToSqsProps = { @@ -135,9 +123,6 @@ test('Pattern deployment w/ bucket versioning turned off', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ specific s3 event types -// -------------------------------------------------------------- test('Test deployment w/ s3 event types and filters', () => { // Stack const stack = new Stack(); @@ -187,9 +172,6 @@ test('Test deployment w/ s3 event types and filters', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ SSE encryption enabled using customer managed KMS CMK -// -------------------------------------------------------------- test('Test deployment w/ SSE encryption enabled using customer managed KMS CMK', () => { // Stack const stack = new Stack(); @@ -218,9 +200,6 @@ test('Test deployment w/ SSE encryption enabled using customer managed KMS CMK', }); }); -// -------------------------------------------------------------- -// Test bad call with existingBucket and bucketProps -// -------------------------------------------------------------- test("Test bad call with existingBucket and bucketProps", () => { // Stack const stack = new Stack(); @@ -240,9 +219,6 @@ test("Test bad call with existingBucket and bucketProps", () => { expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); }); -// -------------------------------------------------------------- -// s3 bucket with bucket, loggingBucket, and auto delete objects -// -------------------------------------------------------------- test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { const stack = new Stack(); @@ -272,9 +248,6 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); }); -// -------------------------------------------------------------- -// s3 bucket with one content bucket and no logging bucket -// -------------------------------------------------------------- test('s3 bucket with one content bucket and no logging bucket', () => { const stack = new Stack(); @@ -382,4 +355,39 @@ test('Queue is encrypted with SQS-managed KMS Key when enable encryption flag is template.hasResourceProperties("AWS::SQS::Queue", { KmsMasterKeyId: "alias/aws/sqs" }); -}); \ No newline at end of file +}); + +test('Confirm CheckSqsProps is called', () => { + // Initial Setup + const stack = new Stack(); + const filter: s3.NotificationKeyFilter = { prefix: 'the/place', suffix: '*.mp3' }; + const props: S3ToSqsProps = { + deployDeadLetterQueue: true, + maxReceiveCount: 0, + s3EventTypes: [s3.EventType.OBJECT_REMOVED], + s3EventFilters: [filter], + queueProps: { + removalPolicy: RemovalPolicy.DESTROY, + }, + existingQueueObj: new sqs.Queue(stack, 'test', {}) + }; + + const app = () => { + new S3ToSqs(stack, 'test-s3-sqs', props); + }; + expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); +}); + +test('Confirm CheckS3Props is being called', () => { + const stack = new Stack(); + + const app = () => { + new S3ToSqs(stack, 'test-s3-sqs', { + bucketProps: {}, + existingBucketObj: new s3.Bucket(stack, 'test-bucket', {}), + }); + }; + + // Assertion + expect(app).toThrowError(/Error - Either provide bucketProps or existingBucketObj, but not both.\n/); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts index cfe47d63c..496dea659 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts @@ -107,6 +107,7 @@ export class S3ToStepfunctions extends Construct { this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); defaults.CheckProps(props); + defaults.CheckS3Props(props); let bucket: s3.IBucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts index 927f09213..6c5486295 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts @@ -108,7 +108,7 @@ test('check properties', () => { // -------------------------------------------------------------- // Test bad call with existingBucket and bucketProps // -------------------------------------------------------------- -test("Test bad call with existingBucket and bucketProps", () => { +test("Confirm that CheckS3Props is getting called", () => { // Stack const stack = new cdk.Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts index d4955ef40..e298db4c2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts @@ -117,6 +117,7 @@ export class SnsToSqs extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckSnsProps(props); + defaults.CheckSqsProps(props); // Setup the dead letter queue, if applicable this.deadLetterQueue = defaults.buildDeadLetterQueue(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts index 6f5f3a79d..eb246cffc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts @@ -12,17 +12,13 @@ */ // Imports -import { Stack } from "aws-cdk-lib"; +import { Stack, RemovalPolicy } from "aws-cdk-lib"; import { SnsToSqs, SnsToSqsProps } from "../lib"; import * as sqs from 'aws-cdk-lib/aws-sqs'; import * as sns from 'aws-cdk-lib/aws-sns'; import * as kms from 'aws-cdk-lib/aws-kms'; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Pattern deployment with new Topic, new Queue and -// default properties -// -------------------------------------------------------------- test('Pattern deployment w/ new Topic, new Queue and default props', () => { // Initial Setup const stack = new Stack(); @@ -65,10 +61,6 @@ test('Pattern deployment w/ new Topic, new Queue and default props', () => { }); }); -// -------------------------------------------------------------- -// Pattern deployment with new Topic, new Queue, and -// overridden properties -// -------------------------------------------------------------- test('Pattern deployment w/ new topic, new queue, and overridden props', () => { // Initial Setup const stack = new Stack(); @@ -110,9 +102,6 @@ test('Pattern deployment w/ new topic, new queue, and overridden props', () => { }); }); -// -------------------------------------------------------------- -// Test the getter methods -// -------------------------------------------------------------- test('Test getter methods', () => { // Initial Setup const stack = new Stack(); @@ -187,9 +176,6 @@ test('Test deployment with imported encryption key', () => { }); }); -// -------------------------------------------------------------- -// Test deployment with SNS managed KMS key -// -------------------------------------------------------------- test('Test deployment with SNS managed KMS key', () => { // Stack const stack = new Stack(); @@ -238,9 +224,6 @@ test('Test deployment with SNS managed KMS key', () => { }); }); -// -------------------------------------------------------------- -// Test deployment with CMK encrypted SNS Topic -// -------------------------------------------------------------- test('Test deployment with CMK encrypted SNS Topic', () => { // Stack const stack = new Stack(); @@ -263,9 +246,6 @@ test('Test deployment with CMK encrypted SNS Topic', () => { }); }); -// -------------------------------------------------------------- -// Pattern deployment with existing Topic and FIFO queues -// -------------------------------------------------------------- test('Pattern deployment w/ existing topic and FIFO queue', () => { // Initial Setup const stack = new Stack(); @@ -308,9 +288,6 @@ test('Pattern deployment w/ existing topic and FIFO queue', () => { }); }); -// -------------------------------------------------------------- -// Pattern deployment with existing Topic and Standard queues -// -------------------------------------------------------------- test('Pattern deployment w/ existing topic and Standard queue', () => { // Initial Setup const stack = new Stack(); @@ -518,4 +495,21 @@ test('Confirm that CheckSnsProps is called', () => { // Assertion expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); +}); + +test('Confirm that CheckSqsProps is called', () => { + // Stack + const stack = new Stack(); + + const app = () => { + new SnsToSqs(stack, 'sns-to-sqs-stack', { + queueProps: { + removalPolicy: RemovalPolicy.DESTROY, + }, + existingQueueObj: new sqs.Queue(stack, 'test', {}) + }); + }; + + // Assertion + expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts index 9d8093255..0b45c93c0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts @@ -112,6 +112,7 @@ export class SqsToLambda extends Construct { constructor(scope: Construct, id: string, props: SqsToLambdaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckSqsProps(props); // Setup the Lambda function this.lambdaFunction = defaults.buildLambdaFunction(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts index efbc2b91f..46738ea6b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts @@ -15,13 +15,10 @@ import { Stack } from "aws-cdk-lib"; import { SqsToLambda, SqsToLambdaProps } from "../lib"; import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as sqs from 'aws-cdk-lib/aws-sqs'; import { Template } from 'aws-cdk-lib/assertions'; import * as kms from 'aws-cdk-lib/aws-kms'; -// -------------------------------------------------------------- -// Pattern deployment w/ new Lambda function and -// overridden properties -// -------------------------------------------------------------- test('Pattern deployment w/ new Lambda function and overridden props', () => { // Initial Setup const stack = new Stack(); @@ -55,9 +52,6 @@ test('Pattern deployment w/ new Lambda function and overridden props', () => { }); }); -// -------------------------------------------------------------- -// Test the getter methods -// -------------------------------------------------------------- test('Test getter methods', () => { // Initial Setup const stack = new Stack(); @@ -98,10 +92,6 @@ test('Test error handling for existing Lambda function', () => { }).toThrowError(); }); -// -------------------------------------------------------------- -// Test error handling for new Lambda function -// w/o required properties -// -------------------------------------------------------------- test('Test error handling for new Lambda function w/o required properties', () => { // Initial Setup const stack = new Stack(); @@ -116,9 +106,6 @@ test('Test error handling for new Lambda function w/o required properties', () = }).toThrowError(); }); -// -------------------------------------------------------------- -// Pattern deployment w/ batch size -// -------------------------------------------------------------- test('Pattern deployment w/ batch size', () => { const stack = new Stack(); const props: SqsToLambdaProps = { @@ -277,4 +264,25 @@ test('Queue is encrypted with customer managed KMS Key when enable encryption fl ] }, }); -}); \ No newline at end of file +}); + +test('Confirm CheckSqsProps is called', () => { + // Initial Setup + const stack = new Stack(); + const props: SqsToLambdaProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`) + }, + deployDeadLetterQueue: true, + maxReceiveCount: 0, + queueProps: {}, + existingQueueObj: new sqs.Queue(stack, 'test', {}) + }; + + const app = () => { + new SqsToLambda(stack, 'test-apigateway-lambda', props); + }; + expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts index 1377e4fd0..87aaad8e1 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts @@ -40,30 +40,15 @@ export interface VerifiedProps { readonly existingLambdaObj?: lambda.Function, readonly lambdaFunctionProps?: lambda.FunctionProps, - readonly existingQueueObj?: sqs.Queue, - readonly queueProps?: sqs.QueueProps, - readonly deployDeadLetterQueue?: boolean, - readonly deadLetterQueueProps?: sqs.QueueProps, - readonly existingMediaStoreContainerObj?: mediastore.CfnContainer; readonly mediaStoreContainerProps?: mediastore.CfnContainerProps; - readonly existingBucketObj?: s3.Bucket, - readonly existingBucketInterface?: s3.IBucket, - readonly bucketProps?: s3.BucketProps, - readonly existingSagemakerEndpointObj?: sagemaker.CfnEndpoint, readonly endpointProps?: sagemaker.CfnEndpointProps, readonly existingSecretObj?: secretsmanager.Secret; readonly secretProps?: secretsmanager.SecretProps; - readonly topicProps?: sns.TopicProps, - - readonly existingVpc?: ec2.IVpc; - readonly vpcProps?: ec2.VpcProps; - readonly deployVpc?: boolean; - readonly encryptionKey?: kms.Key, readonly encryptionKeyProps?: kms.KeyProps @@ -73,10 +58,6 @@ export interface VerifiedProps { readonly logAlbAccessLogs?: boolean; readonly albLoggingBucketProps?: s3.BucketProps; - readonly existingLoggingBucketObj?: s3.IBucket; - readonly loggingBucketProps?: s3.BucketProps; - readonly logS3AccessLogs?: boolean; - readonly insertHttpSecurityHeaders?: boolean; readonly responseHeadersPolicyProps?: ResponseHeadersPolicyProps; readonly openSearchDomainProps?: opensearch.CfnDomainProps; @@ -95,6 +76,11 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } + if ((propsObject?.logAlbAccessLogs === false) && (propsObject.albLoggingBucketProps)) { + errorMessages += 'Error - If logAlbAccessLogs is false, supplying albLoggingBucketProps is invalid.\n'; + errorFound = true; + } + if (propsObject.existingStreamObj && propsObject.kinesisStreamProps) { errorMessages += 'Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'; errorFound = true; @@ -105,46 +91,11 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } - if (propsObject.existingQueueObj && propsObject.queueProps) { - errorMessages += 'Error - Either provide queueProps or existingQueueObj, but not both.\n'; - errorFound = true; - } - - if (propsObject.queueProps?.encryptionMasterKey && propsObject.encryptionKey) { - errorMessages += 'Error - Either provide queueProps.encryptionMasterKey or encryptionKey, but not both.\n'; - errorFound = true; - } - - if (propsObject.queueProps?.encryptionMasterKey && propsObject.encryptionKeyProps) { - errorMessages += 'Error - Either provide queueProps.encryptionMasterKey or encryptionKeyProps, but not both.\n'; - errorFound = true; - } - - if ((propsObject?.deployDeadLetterQueue === false) && propsObject.deadLetterQueueProps) { - errorMessages += 'Error - If deployDeadLetterQueue is false then deadLetterQueueProps cannot be specified.\n'; - errorFound = true; - } - - const isQueueFifo: boolean = propsObject?.queueProps?.fifo; - const isDeadLetterQueueFifo: boolean = propsObject?.deadLetterQueueProps?.fifo; - const deployDeadLetterQueue: boolean = propsObject.deployDeadLetterQueue || propsObject.deployDeadLetterQueue === undefined; - - if (deployDeadLetterQueue && (isQueueFifo !== isDeadLetterQueueFifo)) { - errorMessages += 'Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + - 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'; - errorFound = true; - } - if (propsObject.existingMediaStoreContainerObj && propsObject.mediaStoreContainerProps) { errorMessages += 'Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n'; errorFound = true; } - if (propsObject.existingBucketObj && propsObject.bucketProps) { - errorMessages += 'Error - Either provide bucketProps or existingBucketObj, but not both.\n'; - errorFound = true; - } - if (propsObject.existingSagemakerEndpointObj && propsObject.endpointProps) { errorMessages += 'Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'; errorFound = true; @@ -155,11 +106,6 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } - if ((propsObject.deployVpc || propsObject.vpcProps) && propsObject.existingVpc) { - errorMessages += 'Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'; - errorFound = true; - } - if (propsObject.encryptionKey && propsObject.encryptionKeyProps) { errorMessages += 'Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'; errorFound = true; @@ -175,26 +121,6 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } - if ((propsObject?.logAlbAccessLogs === false) && (propsObject.albLoggingBucketProps)) { - errorMessages += 'Error - If logAlbAccessLogs is false, supplying albLoggingBucketProps is invalid.\n'; - errorFound = true; - } - - if (propsObject.existingLoggingBucketObj && propsObject.loggingBucketProps) { - errorMessages += 'Error - Either provide existingLoggingBucketObj or loggingBucketProps, but not both.\n'; - errorFound = true; - } - - if ((propsObject?.logS3AccessLogs === false) && (propsObject.loggingBucketProps || propsObject.existingLoggingBucketObj)) { - errorMessages += 'Error - If logS3AccessLogs is false, supplying loggingBucketProps or existingLoggingBucketObj is invalid.\n'; - errorFound = true; - } - - if (propsObject.existingBucketObj && (propsObject.loggingBucketProps || propsObject.logS3AccessLogs)) { - errorMessages += 'Error - If existingBucketObj is provided, supplying loggingBucketProps or logS3AccessLogs is an error.\n'; - errorFound = true; - } - if (propsObject.insertHttpSecurityHeaders !== false && propsObject.responseHeadersPolicyProps?.securityHeadersBehavior) { errorMessages += 'responseHeadersPolicyProps.securityHeadersBehavior can only be passed if httpSecurityHeaders is set to `false`.'; errorFound = true; @@ -314,9 +240,116 @@ export function CheckSnsProps(propsObject: SnsProps | any) { } } -export interface DynamoDBProps { +export interface SqsProps { + readonly existingQueueObj?: sqs.Queue, + readonly queueProps?: sqs.QueueProps, + readonly deployDeadLetterQueue?: boolean, + readonly deadLetterQueueProps?: sqs.QueueProps, + readonly encryptionKey?: kms.Key, + readonly encryptionKeyProps?: kms.KeyProps +} + +export function CheckSqsProps(propsObject: SqsProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingQueueObj && propsObject.queueProps) { + errorMessages += 'Error - Either provide queueProps or existingQueueObj, but not both.\n'; + errorFound = true; + } + + if (propsObject.queueProps?.encryptionMasterKey && propsObject.encryptionKey) { + errorMessages += 'Error - Either provide queueProps.encryptionMasterKey or encryptionKey, but not both.\n'; + errorFound = true; + } + + if (propsObject.queueProps?.encryptionMasterKey && propsObject.encryptionKeyProps) { + errorMessages += 'Error - Either provide queueProps.encryptionMasterKey or encryptionKeyProps, but not both.\n'; + errorFound = true; + } + + if ((propsObject?.deployDeadLetterQueue === false) && propsObject.deadLetterQueueProps) { + errorMessages += 'Error - If deployDeadLetterQueue is false then deadLetterQueueProps cannot be specified.\n'; + errorFound = true; + } + + const isQueueFifo: boolean = propsObject?.queueProps?.fifo; + const isDeadLetterQueueFifo: boolean = propsObject?.deadLetterQueueProps?.fifo; + const deployDeadLetterQueue: boolean = propsObject.deployDeadLetterQueue || propsObject.deployDeadLetterQueue === undefined; + + if (deployDeadLetterQueue && (isQueueFifo !== isDeadLetterQueueFifo)) { + errorMessages += 'Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} + +export interface S3Props { + readonly existingBucketObj?: s3.Bucket, + readonly existingBucketInterface?: s3.IBucket, + readonly bucketProps?: s3.BucketProps, + readonly existingLoggingBucketObj?: s3.IBucket; + readonly loggingBucketProps?: s3.BucketProps; + readonly logS3AccessLogs?: boolean; +} + +export function CheckS3Props(propsObject: S3Props | any) { + let errorMessages = ''; + let errorFound = false; + + if ((propsObject.existingBucketObj || propsObject.existingBucketInterface) && propsObject.bucketProps) { + errorMessages += 'Error - Either provide bucketProps or existingBucketObj, but not both.\n'; + errorFound = true; + } + + if (propsObject.existingLoggingBucketObj && propsObject.loggingBucketProps) { + errorMessages += 'Error - Either provide existingLoggingBucketObj or loggingBucketProps, but not both.\n'; + errorFound = true; + } + + if ((propsObject?.logS3AccessLogs === false) && (propsObject.loggingBucketProps || propsObject.existingLoggingBucketObj)) { + errorMessages += 'Error - If logS3AccessLogs is false, supplying loggingBucketProps or existingLoggingBucketObj is invalid.\n'; + errorFound = true; + } + + if (propsObject.existingBucketObj && (propsObject.loggingBucketProps || propsObject.logS3AccessLogs)) { + errorMessages += 'Error - If existingBucketObj is provided, supplying loggingBucketProps or logS3AccessLogs is an error.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} + +export interface VpcProps { + readonly existingVpc?: ec2.IVpc; + readonly vpcProps?: ec2.VpcProps; + readonly deployVpc?: boolean; + } +export function CheckVpcProps(propsObject: VpcProps | any) { + let errorMessages = ''; + let errorFound = false; + + if ((propsObject.deployVpc || propsObject.vpcProps) && propsObject.existingVpc) { + errorMessages += 'Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} + +// export interface DynamoDBProps { +// } + // export function CheckDynamoDBProps(propsObject: GlueProps | any) { // let errorMessages = ''; // let errorFound = false; diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts index aa3f0d250..a45882639 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts @@ -96,16 +96,19 @@ test("Test fail Lambda function check", () => { ); }); +// --------------------------- +// DynamoDB Prop Tests +// --------------------------- test("Test fail SQS Queue check", () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.SqsProps = { queueProps: {}, existingQueueObj: new sqs.Queue(stack, 'placeholder', {}), }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSqsProps(props); }; // Assertion @@ -115,7 +118,7 @@ test("Test fail SQS Queue check", () => { test('Test fail SQS queue check when queueProps.encryptionMasterKey and encryptionKey are both specified', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.SqsProps = { queueProps: { encryptionMasterKey: new kms.Key(stack, 'key') }, @@ -123,7 +126,7 @@ test('Test fail SQS queue check when queueProps.encryptionMasterKey and encrypti }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSqsProps(props); }; expect(app).toThrowError('Error - Either provide queueProps.encryptionMasterKey or encryptionKey, but not both.\n'); @@ -132,7 +135,7 @@ test('Test fail SQS queue check when queueProps.encryptionMasterKey and encrypti test('Test fail SQS queue check when queueProps.encryptionMasterKey and encryptionKeyProps are both specified', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.SqsProps = { encryptionKeyProps: { description: 'key description' }, @@ -142,7 +145,7 @@ test('Test fail SQS queue check when queueProps.encryptionMasterKey and encrypti }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSqsProps(props); }; // Assertion @@ -151,13 +154,13 @@ test('Test fail SQS queue check when queueProps.encryptionMasterKey and encrypti test('Test fail Dead Letter Queue check', () => { - const props: defaults.VerifiedProps = { + const props: defaults.SqsProps = { deployDeadLetterQueue: false, deadLetterQueueProps: {}, }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSqsProps(props); }; // Assertion @@ -166,13 +169,13 @@ test('Test fail Dead Letter Queue check', () => { test('Test fail Dead Letter Queue check with queueProps fifo set to true and undefined deadLetterQueueProps', () => { - const props: defaults.VerifiedProps = { + const props: defaults.SqsProps = { queueProps: { fifo: true }, deadLetterQueueProps: {}, }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSqsProps(props); }; // Assertion @@ -182,13 +185,13 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to true and und test('Test fail Dead Letter Queue check with queueProps fifo set to true and deadLetterQueueProps fifo set to false', () => { - const props: defaults.VerifiedProps = { + const props: defaults.SqsProps = { queueProps: { fifo: true }, deadLetterQueueProps: { fifo: false }, }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSqsProps(props); }; // Assertion @@ -198,13 +201,13 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to true and dea test('Test fail Dead Letter Queue check with queueProps fifo set to false and deadLetterQueueProps fifo set to true', () => { - const props: defaults.VerifiedProps = { + const props: defaults.SqsProps = { deadLetterQueueProps: { fifo: true }, queueProps: { fifo: false }, }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSqsProps(props); }; // Assertion @@ -214,12 +217,12 @@ test('Test fail Dead Letter Queue check with queueProps fifo set to false and de test('Test fail Dead Letter Queue check with deadLetterQueueProps fifo set to true', () => { - const props: defaults.VerifiedProps = { + const props: defaults.SqsProps = { deadLetterQueueProps: { fifo: true }, }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSqsProps(props); }; expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + @@ -228,12 +231,12 @@ test('Test fail Dead Letter Queue check with deadLetterQueueProps fifo set to tr test('Test fail Dead Letter Queue check with queueProps fifo set to false', () => { - const props: defaults.VerifiedProps = { + const props: defaults.SqsProps = { queueProps: { fifo: false }, }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSqsProps(props); }; expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + @@ -284,22 +287,6 @@ test('Test fail Kinesis stream check', () => { expect(app).toThrowError('Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'); }); -test('Test fail S3 check', () => { - const stack = new Stack(); - - const props: defaults.VerifiedProps = { - existingBucketObj: CreateScrapBucket(stack, {}), - bucketProps: {}, - }; - - const app = () => { - defaults.CheckProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); -}); - // --------------------------- // Sns Prop Tests // --------------------------- @@ -555,10 +542,13 @@ test('Test fail encryption key check', () => { expect(app).toThrowError('Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'); }); +// --------------------------- +// S3 Prop Tests +// --------------------------- test('Test fail Vpc check with deployVpc', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.VpcProps = { deployVpc: true, existingVpc: defaults.buildVpc(stack, { defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), @@ -566,7 +556,7 @@ test('Test fail Vpc check with deployVpc', () => { }; const app = () => { - defaults.CheckProps(props); + defaults.CheckVpcProps(props); }; // Assertion @@ -576,7 +566,7 @@ test('Test fail Vpc check with deployVpc', () => { test('Test fail Vpc check with vpcProps', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.VpcProps = { vpcProps: defaults.DefaultPublicPrivateVpcProps(), existingVpc: defaults.buildVpc(stack, { defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), @@ -584,17 +574,37 @@ test('Test fail Vpc check with vpcProps', () => { }; const app = () => { - defaults.CheckProps(props); + defaults.CheckVpcProps(props); }; // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); +// --------------------------- + +// --------------------------- +// S3 Prop Tests +// --------------------------- +test('Test fail S3 check', () => { + const stack = new Stack(); + + const props: defaults.S3Props = { + existingBucketObj: CreateScrapBucket(stack, {}), + bucketProps: {}, + }; + + const app = () => { + defaults.CheckS3Props(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); +}); test('Test fail existing log bucket and log bucket prop check', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.S3Props = { existingLoggingBucketObj: new s3.Bucket(stack, 'logging-bucket'), loggingBucketProps: { autoDeleteObjects: true @@ -602,7 +612,7 @@ test('Test fail existing log bucket and log bucket prop check', () => { }; const app = () => { - defaults.CheckProps(props); + defaults.CheckS3Props(props); }; // Assertion @@ -612,13 +622,13 @@ test('Test fail existing log bucket and log bucket prop check', () => { test('Test fail false logS3Accesslogs and loggingBucketProps check', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.S3Props = { existingLoggingBucketObj: new s3.Bucket(stack, 'logging-bucket'), logS3AccessLogs: false }; const app = () => { - defaults.CheckProps(props); + defaults.CheckS3Props(props); }; // Assertion @@ -628,7 +638,7 @@ test('Test fail false logS3Accesslogs and loggingBucketProps check', () => { test('Test fail existingBucketObj and loggingBucketProps check', () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.S3Props = { existingBucketObj: new s3.Bucket(stack, 'temp-bucket'), loggingBucketProps: { autoDeleteObjects: true @@ -636,12 +646,13 @@ test('Test fail existingBucketObj and loggingBucketProps check', () => { }; const app = () => { - defaults.CheckProps(props); + defaults.CheckS3Props(props); }; // Assertion expect(app).toThrowError('Error - If existingBucketObj is provided, supplying loggingBucketProps or logS3AccessLogs is an error.\n'); }); +// --------------------------- test('Test successful CheckListValues', () => { From 0787baf7c68f84599139e5b886d5942b076174f2 Mon Sep 17 00:00:00 2001 From: Dmitry Fisenko Date: Mon, 18 Sep 2023 17:50:03 -0400 Subject: [PATCH 49/73] fix(all): typos (#1010) * fix: typos * fix: typos --- CHANGELOG.md | 8 +++--- CHANGELOG.v1.md | 10 ++++---- CONTRIBUTING.md | 4 +-- DESIGN_GUIDELINES.md | 4 +-- DEVELOPER_GUIDE.md | 4 +-- deployment/build-cdk-dist.sh | 2 +- deployment/v2/build-cdk-dist.sh | 2 +- .../aws-alb-fargate/README.md | 2 +- .../aws-alb-fargate/lib/index.ts | 2 +- .../aws-alb-lambda/lib/index.ts | 12 +++------ ...mplates-custom-resource-name.expected.json | 4 +-- ...additional-request-templates.expected.json | 4 +-- ...teg.apigateway-dynamodb-CRUD.expected.json | 4 +-- ...eway-dynamodb-existing-table.expected.json | 4 +-- ...custom-integration-responses.expected.json | 4 +-- .../test/integ.no-arguments.expected.json | 4 +-- .../aws-apigateway-iot/README.md | 4 +-- .../aws-apigateway-iot/lib/index.ts | 6 ++--- .../test/integ.defaultParams.expected.json | 4 +-- .../test/integ.overrideParams.expected.json | 24 +++++++++--------- .../test/integ.overrideParams.ts | 4 +-- ...integ.override_auth_api_keys.expected.json | 22 ++++++++-------- .../test/test.apigateway-iot.test.ts | 16 ++++++------ .../test/apigateway-kinesisstreams.test.ts | 4 +-- ...additional-request-templates.expected.json | 4 +-- ...apigateway-kinesis-overwrite.expected.json | 4 +-- ...custom-integration-responses.expected.json | 4 +-- .../test/integ.no-arguments.expected.json | 4 +-- .../test/integ.deployFunction.expected.json | 4 +-- .../test/integ.existingFunction.expected.json | 4 +-- ...additional-request-templates.expected.json | 4 +-- ...-sagemakerendpoint-overwrite.expected.json | 4 +-- .../test/integ.no-overwrite.expected.json | 4 +-- .../test/apigateway-sqs.test.ts | 2 +- ...additional-request-templates.expected.json | 4 +-- .../integ.apigateway-sqs-crud.expected.json | 4 +-- ...custom-integration-responses.expected.json | 4 +-- .../test/integ.existing-queue.expected.json | 4 +-- .../test/integ.no-arguments.expected.json | 4 +-- ...ustomCloudfrontLoggingBucket.expected.json | 4 +-- .../test/integ.no-arguments.expected.json | 4 +-- .../integ.override-behavior.expected.json | 4 +-- ...ustomCloudfrontLoggingBucket.expected.json | 4 +-- .../test/integ.no-arguments.expected.json | 4 +-- .../aws-cloudfront-mediastore/lib/index.ts | 2 +- .../aws-cloudfront-s3/lib/index.ts | 2 +- .../lib/index.ts | 2 +- .../test/integ.no-arguments.expected.json | 4 +-- .../test.cognito-apigateway-lambda.test.ts | 4 +-- .../README.md | 4 +-- .../aws-fargate-dynamodb/lib/index.ts | 2 +- .../aws-fargate-eventbridge/lib/index.ts | 2 +- .../aws-fargate-kinesisfirehose/lib/index.ts | 2 +- .../aws-fargate-opensearch/lib/index.ts | 2 +- .../test/fargate-opensearch.test.ts | 2 +- .../aws-fargate-s3/lib/index.ts | 2 +- .../aws-fargate-secretsmanager/lib/index.ts | 2 +- .../aws-fargate-sns/lib/index.ts | 2 +- .../aws-fargate-sns/test/fargate-sns.test.ts | 2 +- .../integ.existing-resources.expected.json | 4 +-- .../test/integ.existing-resources.ts | 2 +- .../aws-fargate-sqs/lib/index.ts | 2 +- .../aws-fargate-sqs/test/fargate-sqs.test.ts | 4 +-- .../lib/index.ts | 2 +- .../aws-fargate-stepfunctions/lib/index.ts | 2 +- .../test/test.iot-kinesisstreams.test.ts | 4 +-- .../aws-iot-lambda-dynamodb/README.md | 4 +-- .../aws-iot-s3/test/iot-s3.test.ts | 4 +-- .../aws-kinesisfirehose-s3/lib/index.ts | 4 +-- .../aws-kinesisstreams-gluejob/README.md | 4 +-- .../aws-kinesisstreams-gluejob/lib/index.ts | 6 ++--- .../test/integ.code-asset-job.expected.json | 4 +-- .../test/integ.no-arguments.expected.json | 4 +-- .../test/kinesisstream-gluejob.test.ts | 2 +- .../lib/index.ts | 4 +-- .../aws-lambda-dynamodb/README.md | 2 +- .../aws-lambda-elasticachememcached/README.md | 2 +- .../aws-lambda-elasticsearch-kibana/README.md | 2 +- .../aws-lambda-eventbridge/README.md | 2 +- .../test/aws-lambda-eventbridge.test.ts | 4 +-- .../aws-lambda-kendra/README.md | 2 +- .../{achitecture.png => architecture.png} | Bin .../test/lambda-kendra.test.ts | 4 +-- .../aws-lambda-kinesisfirehose/README.md | 2 +- .../aws-lambda-kinesisstreams/README.md | 2 +- .../aws-lambda-s3/README.md | 2 +- .../aws-lambda-sagemakerendpoint/README.md | 4 +-- .../aws-lambda-sagemakerendpoint/lib/index.ts | 2 +- .../test/aws-lambda-sagemakerendpoint.test.ts | 14 +++++----- .../aws-lambda-secretsmanager/README.md | 2 +- .../aws-lambda-secretsmanager/lib/index.ts | 2 +- .../aws-lambda-sns/README.md | 2 +- .../aws-lambda-sns/test/lambda-sns.test.ts | 4 +-- .../aws-lambda-sqs-lambda/README.md | 2 +- .../aws-lambda-sqs/README.md | 2 +- .../aws-lambda-sqs/test/lambda-sqs.test.ts | 2 +- .../aws-lambda-ssmstringparameter/README.md | 2 +- .../aws-lambda-stepfunctions/README.md | 2 +- .../aws-openapigateway-lambda/README.md | 8 +++--- ...AssetExistingLambdaFunctions.expected.json | 4 +-- ...iFromAssetNewLambdaFunctions.expected.json | 4 +-- ....apiFromAssetWithCognitoAuth.expected.json | 4 +-- .../aws-route53-apigateway/lib/index.ts | 4 +-- .../test/integ.dummyTest.expected.json | 4 +-- .../aws-sns-lambda/test/sns-lambda.test.ts | 4 +-- .../test/test.sqs-lambda.test.ts | 2 +- .../test/test-helper.ts | 10 ++++---- .../core/lib/apigateway-helper.ts | 6 ++--- .../lib/cloudfront-distribution-defaults.ts | 2 +- .../lib/cloudfront-distribution-helper.ts | 4 +-- .../core/lib/fargate-helper.ts | 8 +++--- .../core/lib/glue-job-helper.ts | 8 +++--- .../core/lib/glue-table-helper.ts | 4 +-- .../core/lib/kendra-helper.ts | 6 ++--- .../core/lib/lambda-helper.ts | 6 ++--- .../core/lib/sagemaker-helper.ts | 4 +-- .../core/lib/utils.ts | 4 +-- .../core/test/glue-job-helper.test.ts | 4 +-- .../core/test/input-validation.test.ts | 4 +-- .../core/test/kendra-helper.test.ts | 10 ++++---- .../core/test/lambda-helper.test.ts | 2 +- .../resources/README.md | 4 +-- .../test/integ.template-writer.expected.json | 4 +-- .../test/integ.gluejob.expected.json | 4 +-- .../kitchenStaffStack.test.js.snap | 2 +- .../kitchenStaffStack.test.ts.snap | 2 +- .../serviceStaffStack.test.js.snap | 2 +- .../serviceStaffStack.test.ts.snap | 2 +- 128 files changed, 261 insertions(+), 267 deletions(-) rename source/patterns/@aws-solutions-constructs/aws-lambda-kendra/{achitecture.png => architecture.png} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d7e89f3d..603c7e088 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -319,7 +319,7 @@ This is one of a number of identical releases we have created as we overhaul our ### Features -* Includes all funcionality of V1.137.0 +* Includes all functionality of V1.137.0 * Build upon underlying CDK version V2.4.0 * **aws-alb-fargate:** New Construct ([#560](https://github.com/awslabs/aws-solutions-constructs/issues/560)) ([5a21b76](https://github.com/awslabs/aws-solutions-constructs/commit/5a21b7652be0be2c77957155a504a9582830eeba)) @@ -333,7 +333,7 @@ This is one of a number of identical releases we have created as we overhaul our ## [2.0.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.0.0-rc.2...v2.0.0) (2021-12-02) -* Includes all funcionality of V1.129.0 +* Includes all functionality of V1.129.0 ### Features @@ -369,7 +369,7 @@ This is one of a number of identical releases we have created as we overhaul our * **apigateway-helper:** fixed condition for cloudWatchRole creation ([#468](https://github.com/awslabs/aws-solutions-constructs/issues/468)) ([e454349](https://github.com/awslabs/aws-solutions-constructs/commit/e45434928a17cde580698a82ee53f6ee7463c6cf)) * **scripts:** Fix postinstall script ([#477](https://github.com/awslabs/aws-solutions-constructs/issues/477)) ([3902a91](https://github.com/awslabs/aws-solutions-constructs/commit/3902a912547b2e7645ad352feec9811d88678543)) * **service-staff:** Fix create-order lambda ([#479](https://github.com/awslabs/aws-solutions-constructs/issues/479)) ([982c026](https://github.com/awslabs/aws-solutions-constructs/commit/982c02619d0bb4a5f9fd1433f60b74ef89a1603c)) -* **Set outputBucket property on aws-kinesisstreams-gluejob:** Issue [#448](https://github.com/awslabs/aws-solutions-constructs/issues/448) to include S3 bucket for Glue Job that the consturct creates ([#452](https://github.com/awslabs/aws-solutions-constructs/issues/452)) ([c40e1f7](https://github.com/awslabs/aws-solutions-constructs/commit/c40e1f7c3524652ac8e3277b1c482975e6df9e36)) +* **Set outputBucket property on aws-kinesisstreams-gluejob:** Issue [#448](https://github.com/awslabs/aws-solutions-constructs/issues/448) to include S3 bucket for Glue Job that the construct creates ([#452](https://github.com/awslabs/aws-solutions-constructs/issues/452)) ([c40e1f7](https://github.com/awslabs/aws-solutions-constructs/commit/c40e1f7c3524652ac8e3277b1c482975e6df9e36)) ## 2.0.0-rc.1 (2021-10-12) @@ -422,4 +422,4 @@ This is the first release candidate of Solutions Constructs 2.0 based on CDK v2. - aws-sns-sqs - aws-sqs-lambda - aws-wafwebacl-apigateway -- aws-wafwebacl-cloudfront \ No newline at end of file +- aws-wafwebacl-cloudfront diff --git a/CHANGELOG.v1.md b/CHANGELOG.v1.md index f7fde29ee..6f4dc876b 100644 --- a/CHANGELOG.v1.md +++ b/CHANGELOG.v1.md @@ -261,7 +261,7 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes * **apigateway-helper:** fixed condition for cloudWatchRole creation ([#468](https://github.com/awslabs/aws-solutions-constructs/issues/468)) ([e454349](https://github.com/awslabs/aws-solutions-constructs/commit/e45434928a17cde580698a82ee53f6ee7463c6cf)) -* **Set outputBucket property on aws-kinesisstreams-gluejob:** Issue [#448](https://github.com/awslabs/aws-solutions-constructs/issues/448) to include S3 bucket for Glue Job that the consturct creates ([#452](https://github.com/awslabs/aws-solutions-constructs/issues/452)) ([c40e1f7](https://github.com/awslabs/aws-solutions-constructs/commit/c40e1f7c3524652ac8e3277b1c482975e6df9e36)) +* **Set outputBucket property on aws-kinesisstreams-gluejob:** Issue [#448](https://github.com/awslabs/aws-solutions-constructs/issues/448) to include S3 bucket for Glue Job that the construct creates ([#452](https://github.com/awslabs/aws-solutions-constructs/issues/452)) ([c40e1f7](https://github.com/awslabs/aws-solutions-constructs/commit/c40e1f7c3524652ac8e3277b1c482975e6df9e36)) ## [1.125.0](https://github.com/awslabs/aws-solutions-constructs/compare/v1.124.0...v1.125.0) (2021-10-08) @@ -515,7 +515,7 @@ All notable changes to this project will be documented in this file. See [standa ### Changed * Upgraded all patterns to CDK v1.105.0 -* aws-s3-step-function now triggers for Mulitpart uploads and Copy Object [#198](https://github.com/awslabs/aws-solutions-constructs/pull/198) +* aws-s3-step-function now triggers for Multipart uploads and Copy Object [#198](https://github.com/awslabs/aws-solutions-constructs/pull/198) * Change S3 protocol in glue to use s3a:// [#197](https://github.com/awslabs/aws-solutions-constructs/pull/197) * Change policy name in for glue so multiple constructs can be included in a single stack [#197](https://github.com/awslabs/aws-solutions-constructs/pull/197) @@ -579,14 +579,14 @@ All notable changes to this project will be documented in this file. See [standa ### Changed - Upgraded all patterns to CDK v1.97.0 -- Made changes to accomodate cfn_nag rule W92 +- Made changes to accommodate cfn_nag rule W92 - Updated integration tests to destroy S3 buckets when tearing down the test stack ## 1.96.0 (2021-04-07) ### Changed - Upgraded all patterns to CDK v1.96.0 -- Made changes to accomodate cfn_nag rules W89 and W90 +- Made changes to accommodate cfn_nag rules W89 and W90 ## 1.95.2 (2021-04-03) @@ -745,7 +745,7 @@ All notable changes to this project will be documented in this file. See [standa ### Changed - Upgraded all patterns to CDK v1.76.0 -- Added ESLint rule to enfore 2 space indentation +- Added ESLint rule to enforce 2 space indentation - Updated `aws-lambda-sqs` to support for VPC ## 1.75.0 (2020-12-03) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 09f16ad94..2c8ba3d82 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -81,7 +81,7 @@ Now it's time to work your magic. Here are some guidelines: it might be easier to get started that way. * To ensure CDKv2 compatibility of all the Solutions Constructs, please ensure the code meets the following guidelines: * Import statement for `Construct` is standalone, for example, `import { Construct } from '@aws-cdk/core';` instead of `import { Construct, App, Aws } from '@aws-cdk/core';` - * Check to make sure the usage of `Construct` in the code is also standalone, for example, `export class IotToSqs extends Construct` insted of `export class IotToSqs extends cdk.Construct` + * Check to make sure the usage of `Construct` in the code is also standalone, for example, `export class IotToSqs extends Construct` instead of `export class IotToSqs extends cdk.Construct` * Core classes are imported from `@aws-cdk/core` only, for example, `import { Duration } from "@aws-cdk/core;` instead of `import { Duration } from "@aws-cdk/core/lib/duration";` * DO NOT USE deprecated APIs, it will not build in CDKv2, for example, using `statistic?` attribute of [@aws-cdk/aws-cloudwatch.Alarm](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_cloudwatch.Alarm.html) Construct Props will fail to build in CDKv2 * DO NOT USE experimental modules, it will not build in CDKv2, for example, avoid using L2 constructs for [HTTP or Websocket API](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-apigatewayv2-readme.html) will fail to build in CDKv2 @@ -135,7 +135,7 @@ Each integration test generates a .expected.json file by actually deploying the The standard `npm run build+lint+test` command will compare the cdk synth output against the .expected.json file. The Solutions Constructs team will run `npm run integ` in each construct periodically to guard against drift and ensure each construct still deploys. -NOTE: Running `npm run integ` will launch a stack including the construct for each integration test. It will also delete the stack after collecting the CloudFormation template. While the stack will only be around for a few seconds, during this time you account will be billed for the resoruces. Some tests may leave behind an S3 bucket - you should check after running this step. Ideally, +NOTE: Running `npm run integ` will launch a stack including the construct for each integration test. It will also delete the stack after collecting the CloudFormation template. While the stack will only be around for a few seconds, during this time you account will be billed for the resources. Some tests may leave behind an S3 bucket - you should check after running this step. Ideally, ### Step 4: Commit diff --git a/DESIGN_GUIDELINES.md b/DESIGN_GUIDELINES.md index f1052c964..a7cf6f699 100644 --- a/DESIGN_GUIDELINES.md +++ b/DESIGN_GUIDELINES.md @@ -184,7 +184,7 @@ Existing Inconsistencies would not be published, that’s for our internal use | Name | Type | Description | Notes | | --- | --- | --- | --- | -| eventsRule | [`events.Rule`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_events.Rule.html)|Returns an instance of `events.Rule` created by the construct. Only exposed when EventBridge is the soure of events, not exposed when other services (Lambda, Fargate) are triggering events. | +| eventsRule | [`events.Rule`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_events.Rule.html)|Returns an instance of `events.Rule` created by the construct. Only exposed when EventBridge is the source of events, not exposed when other services (Lambda, Fargate) are triggering events. | | eventBus? | [`events.IEventBus`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_events.IEventBus.html)|Returns the instance of `events.IEventBus` used by the construct| Required only for non-default Event Buses.| ## Fargate @@ -369,7 +369,7 @@ Existing Inconsistencies would not be published, that’s for our internal use | --- | --- | --- |--- | | existingVpc? | [`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An existing VPC in which to deploy the construct. Providing both this and `vpcProps` is an error.| | deployVpc? |`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:

  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| -| vpcProps? |[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the Construct, so any values for those properties supplied here will be overrriden. If `deployVpc?` is not `true` then this property will be ignored. | +| vpcProps? |[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the Construct, so any values for those properties supplied here will be overridden. If `deployVpc?` is not `true` then this property will be ignored. | **Required Construct Properties** diff --git a/DEVELOPER_GUIDE.md b/DEVELOPER_GUIDE.md index 57b8e47a9..f67c2852f 100644 --- a/DEVELOPER_GUIDE.md +++ b/DEVELOPER_GUIDE.md @@ -2,7 +2,7 @@ Solutions Constructs are built in typescript in a rather complex build environment. This is to support all the associated testing, code checking and compilation for Java, Python and .NET client. So that you don't have to recreate the entire toolset on your workstation, all building is done on a publicly available docker container. Using this container has both advantages and drawbacks. This document isn't going to pass judgment on these tradeoffs, it's just going to teach you how to build constructs. -Install Docker on your workstation. We're not going to go into detail on how to do this, you probably already have it installed. If not, you can get it [here](https://docs.docker.com/get-docker/). We strongly recommend you increase the amount of system resources dedicated to a docker container prior to starting the build - this can make the difference between the build taking several hours and the build taking 45 minutes. You can adjust these in the Resources tab under the Settings page on the Docker Dahsboard. A good starting point where we have had success is: +Install Docker on your workstation. We're not going to go into detail on how to do this, you probably already have it installed. If not, you can get it [here](https://docs.docker.com/get-docker/). We strongly recommend you increase the amount of system resources dedicated to a docker container prior to starting the build - this can make the difference between the build taking several hours and the build taking 45 minutes. You can adjust these in the Resources tab under the Settings page on the Docker Dashboard. A good starting point where we have had success is: CPUs: 6 Memory: 8 GB @@ -24,7 +24,7 @@ Disk image size: 60 GB ## Working on Your Construct -The build-patterns.sh script sets everything up to build constructs, builds everything, then resets all the settings back where it started. What kind of settings? For instance - you may have noticed that the version numbers in package.json are 0.0.0 for all CDK and construct references. build-patterns.sh runs a script (align-version.sh) that sets all version numbers to the current version of the Solutions Constructs library. After the build it runs the script again (`align-version.sh revert`) to set the version numbers back to 0.0.0 so the code is back in sync with the repo. The steps below perform the first part of build-patterns.sh so you can compile an indivdual folder, such as a single construct or /core. We call building a single construct rather than the whole library a partial build. +The build-patterns.sh script sets everything up to build constructs, builds everything, then resets all the settings back where it started. What kind of settings? For instance - you may have noticed that the version numbers in package.json are 0.0.0 for all CDK and construct references. build-patterns.sh runs a script (align-version.sh) that sets all version numbers to the current version of the Solutions Constructs library. After the build it runs the script again (`align-version.sh revert`) to set the version numbers back to 0.0.0 so the code is back in sync with the repo. The steps below perform the first part of build-patterns.sh so you can compile an individual folder, such as a single construct or /core. We call building a single construct rather than the whole library a partial build. | Action | Explanation | | :------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/deployment/build-cdk-dist.sh b/deployment/build-cdk-dist.sh index 9a2ad875e..b5789c55b 100755 --- a/deployment/build-cdk-dist.sh +++ b/deployment/build-cdk-dist.sh @@ -36,7 +36,7 @@ for subdir in $source_dir/patterns/\@aws-solutions-constructs/* ; do then if [ "$cnt" -eq "0" ] then - echo "************** [ERROR] ************* Did not find any integ CFN templates in $subdir; please add atleast one by writing an integ test case and running cdk-integ command to generate the CFN template for it" + echo "************** [ERROR] ************* Did not find any integ CFN templates in $subdir; please add at least one by writing an integ test case and running cdk-integ command to generate the CFN template for it" exit 1 fi fi diff --git a/deployment/v2/build-cdk-dist.sh b/deployment/v2/build-cdk-dist.sh index 43d08f849..cd6790415 100755 --- a/deployment/v2/build-cdk-dist.sh +++ b/deployment/v2/build-cdk-dist.sh @@ -29,7 +29,7 @@ for subdir in $source_dir/patterns/\@aws-solutions-constructs/* ; do then if [ "$cnt" -eq "0" ] then - echo "************** [ERROR] ************* Did not find any integ CFN templates in $subdir; please add atleast one by writing an integ test case and running cdk-integ command to generate the CFN template for it" + echo "************** [ERROR] ************* Did not find any integ CFN templates in $subdir; please add at least one by writing an integ test case and running cdk-integ command to generate the CFN template for it" exit 1 fi fi diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/README.md b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/README.md index 012837493..5a6ee8d5c 100755 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/README.md @@ -140,7 +140,7 @@ new AlbToFargate(this, "AlbToFargatePattern", new AlbToFargateProps.Builder() | containerDefinitionProps? | [ecs.ContainerDefinitionProps \| any](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs.ContainerDefinitionProps.html) | Optional props to define the container created for the Fargate Service (defaults found in fargate-defaults.ts) | | fargateTaskDefinitionProps? | [ecs.FargateTaskDefinitionProps \| any](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs.FargateTaskDefinitionProps.html) | Optional props to define the Fargate Task Definition for this construct (defaults found in fargate-defaults.ts) | | fargateServiceProps? | [ecs.FargateServiceProps \| any](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs.FargateServiceProps.html) | Optional properties to override default values for the Fargate service. Service will set up in the Public or Isolated subnets of the VPC by default, override that (e.g. - choose Private subnets) by setting vpcSubnets on this object. | -| existingFargateServiceObject? | [ecs.FargateService](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs.FargateService.html) | A Fargate Service already instantiated (probably by another Solutions Construct). If this is specified, then no props defining a new service can be provided, including: existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface | +| existingFargateServiceObject? | [ecs.FargateService](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs.FargateService.html) | A Fargate Service already instantiated (probably by another Solutions Construct). If this is specified, then no props defining a new service can be provided, including: existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface | | existingContainerDefinitionObject? | [ecs.ContainerDefinition](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs.ContainerDefinition.html) | A container definition already instantiated as part of a Fargate service. This must be the container in the existingFargateServiceObject | ## Pattern Properties diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts index bd9e7ba9c..c710a9dcb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts @@ -140,7 +140,7 @@ export interface AlbToFargateProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface * * @default - none diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts index 68c7d21b4..f8253363e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts @@ -146,7 +146,7 @@ export class AlbToLambda extends Construct { this.lambdaFunction = defaults.buildLambdaFunction(this, { existingLambdaObj: props.existingLambdaObj, lambdaFunctionProps: props.lambdaFunctionProps, - vpc: this.vpc, + vpc: this.vpc }); let newListener: boolean; @@ -158,12 +158,7 @@ export class AlbToLambda extends Construct { // If there's no listener, then we add one here if (newListener) { - this.listener = defaults.AddListener( - this, - id, - this.loadBalancer, - props.listenerProps - ); + this.listener = defaults.AddListener(this, id, this.loadBalancer, props.listenerProps); } else { this.listener = GetActiveListener(this.loadBalancer.listeners); } @@ -178,13 +173,12 @@ export class AlbToLambda extends Construct { // this.listener needs to be set on the construct. // could be above: else { defaults.GetActiveListener } - // do we then move that funcionality back into the construct (not the function). If so do + // do we then move that functionality back into the construct (not the function). If so do // we leave it in AddNewTarget or just do it here and pass the listener? if (newListener && this.listener) { const levelOneListener = this.listener.node.defaultChild as CfnListener; const cfnTargetGroup = newTargetGroup.node.defaultChild as CfnTargetGroup; levelOneListener.addDependency(cfnTargetGroup); } - } } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates-custom-resource-name.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates-custom-resource-name.expected.json index eed3a0f92..782a0bdc5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates-custom-resource-name.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates-custom-resource-name.expected.json @@ -82,7 +82,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -423,4 +423,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates.expected.json index fd2c4df63..8a7cb091d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates.expected.json @@ -74,7 +74,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -415,4 +415,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-CRUD.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-CRUD.expected.json index daaaa1812..facc03a46 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-CRUD.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-CRUD.expected.json @@ -77,7 +77,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -688,4 +688,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.expected.json index 3dbfbe88b..84ec8af74 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.expected.json @@ -74,7 +74,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -403,4 +403,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.custom-integration-responses.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.custom-integration-responses.expected.json index 09e5898b1..e67df73de 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.custom-integration-responses.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.custom-integration-responses.expected.json @@ -74,7 +74,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -403,4 +403,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.no-arguments.expected.json index 521cd4b5a..5c02ac352 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.no-arguments.expected.json @@ -74,7 +74,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -403,4 +403,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/README.md b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/README.md index 168da9202..de65e6499 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/README.md @@ -104,8 +104,8 @@ Below is a description of the different resources and methods exposed by the API |Method | Resource | Query parameter(s) | Return code(s) | Description| |-------------- | --------------------- | ------------------ | ----------------- | -----------------| | **POST** | `/message/` | **qos** | `200/403/500` | By calling this endpoint, you need to pass the topics on which you would like to publish (e.g `/message/device/foo`).| -| **POST** | `/shadow/` | **None** | `200/403/500` | This route allows to update the shadow document of a thing, given its `thingName` using Unnamed (classic) shadow type. The body shall comply with the standard shadow stucture comprising a `state` node and associated `desired` and `reported` nodes. See the [Updating device shadows](#updating-device-shadows) section for an example.| -| **POST** | `/shadow//` | **None** | `200/403/500` | This route allows to update the named shadow document of a thing, given its `thingName` and the `shadowName` using the Named shadow type. The body shall comply with the standard shadow stucture comprising a `state` node and associated `desired` and `reported` nodes. See the [Updating named shadows](#updating-named-shadows) section for an example.| +| **POST** | `/shadow/` | **None** | `200/403/500` | This route allows to update the shadow document of a thing, given its `thingName` using Unnamed (classic) shadow type. The body shall comply with the standard shadow structure comprising a `state` node and associated `desired` and `reported` nodes. See the [Updating device shadows](#updating-device-shadows) section for an example.| +| **POST** | `/shadow//` | **None** | `200/403/500` | This route allows to update the named shadow document of a thing, given its `thingName` and the `shadowName` using the Named shadow type. The body shall comply with the standard shadow structure comprising a `state` node and associated `desired` and `reported` nodes. See the [Updating named shadows](#updating-named-shadows) section for an example.| ## Architecture diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/lib/index.ts index 2ceec6366..fa753702f 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/lib/index.ts @@ -204,7 +204,7 @@ export class ApiGatewayToIot extends Construct { * Adds a method to specified resource * @param resource API Gateway resource to which this method is added * @param resourcePath path of resource from root - * @param integReqParams request paramters for the Integration method + * @param integReqParams request parameters for the Integration method * @param methodReqParams request parameters at Method level */ private addResourceMethod(resource: api.IResource, props: ApiGatewayToIotProps, resourcePath: string, @@ -279,12 +279,12 @@ export class ApiGatewayToIot extends Construct { ); if (props.apiGatewayCreateApiKey === true) { - // cfn Nag doesn't like having a HTTP Method with Authorization Set to None, supress the warning + // cfn Nag doesn't like having a HTTP Method with Authorization Set to None, suppress the warning defaults.addCfnSuppressRules(apiMethod, [ { id: "W59", reason: - "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE", + "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE", }, ]); } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.expected.json index 43342533a..cb176c354 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.expected.json @@ -146,7 +146,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -1300,4 +1300,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.expected.json index d1350f303..1133dd641 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.expected.json @@ -1,5 +1,5 @@ { - "Description": "Integration Test for aws-apigateway-iot with overriden params", + "Description": "Integration Test for aws-apigateway-iot with overridden params", "Resources": { "apigatewayiotrole39B3B182": { "Type": "AWS::IAM::Role", @@ -140,7 +140,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -294,7 +294,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -405,7 +405,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -518,7 +518,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -633,7 +633,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -750,7 +750,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -869,7 +869,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -990,7 +990,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -1114,7 +1114,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -1225,7 +1225,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -1421,4 +1421,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.ts index e232337a1..373913c2b 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.ts @@ -21,7 +21,7 @@ import { generateIntegStackName } from '@aws-solutions-constructs/core'; // App setup const app = new cdk.App(); const stack = new cdk.Stack(app, generateIntegStackName(__filename)); -stack.templateOptions.description = 'Integration Test for aws-apigateway-iot with overriden params'; +stack.templateOptions.description = 'Integration Test for aws-apigateway-iot with overridden params'; const apiGatewayProps = { restApiName: 'RestApi-Regional', @@ -74,4 +74,4 @@ const props: ApiGatewayToIotProps = { new ApiGatewayToIot(stack, 'test-apigateway-iot', props); // Synth -app.synth(); \ No newline at end of file +app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.expected.json index 0956ec2ad..1a2184a10 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.expected.json @@ -146,7 +146,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -300,7 +300,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -411,7 +411,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -524,7 +524,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -639,7 +639,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -756,7 +756,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -875,7 +875,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -996,7 +996,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -1120,7 +1120,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -1231,7 +1231,7 @@ "rules_to_suppress": [ { "id": "W59", - "reason": "When ApiKey is being created, we also set apikeyRequired to true, so techincally apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" + "reason": "When ApiKey is being created, we also set apikeyRequired to true, so technically apiGateway still looks for apiKey even though user specified AuthorizationType to NONE" } ] } @@ -1427,4 +1427,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/test.apigateway-iot.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/test.apigateway-iot.test.ts index 08167903f..0ef55d50f 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/test.apigateway-iot.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/test.apigateway-iot.test.ts @@ -45,7 +45,7 @@ test('Test for default IAM Role', () => { iotEndpoint: `a1234567890123-ats` }; new ApiGatewayToIot(stack, 'test-apigateway-iot-default-iam-role', props); - // Check whether default IAM role is creted to access IoT core + // Check whether default IAM role is created to access IoT core const template = Template.fromStack(stack); template.hasResourceProperties("AWS::IAM::Role", { AssumeRolePolicyDocument: { @@ -152,7 +152,7 @@ test('Test for default Params Integ Props and Method Props', () => { new ApiGatewayToIot(stack, 'test-apigateway-iot-integpros-methodprops', props); // Assertion for {topic-level-7} to ensure all Integration Request Params, Integration Responses, - // Method Request Params and Method Reponses are intact + // Method Request Params and Method Reposes are intact const template = Template.fromStack(stack); template.hasResourceProperties("AWS::ApiGateway::Method", { HttpMethod: "POST", @@ -238,7 +238,7 @@ test('Test for default Params Integ Props and Method Props', () => { // -------------------------------------------------------------- // Check for valid IoT Endpoint // -------------------------------------------------------------- -test('Test for valid iot enpoint', () => { +test('Test for valid iot endpoint', () => { // Initial Setup const stack = new cdk.Stack(); const props: ApiGatewayToIotProps = { @@ -297,9 +297,9 @@ test('Test for Api Name and Desc', () => { }); // -------------------------------------------------------------- -// Check for Overriden IAM Role +// Check for Overridden IAM Role // -------------------------------------------------------------- -test('Test for overriden IAM Role', () => { +test('Test for overridden IAM Role', () => { // Initial Setup const stack = new cdk.Stack(); @@ -337,8 +337,8 @@ test('Test for overriden IAM Role', () => { apiGatewayExecutionRole, }; - new ApiGatewayToIot(stack, 'test-apigateway-iot-overriden-iam-role', props); - // Check whether default IAM role is creted to access IoT core + new ApiGatewayToIot(stack, 'test-apigateway-iot-overridden-iam-role', props); + // Check whether default IAM role is created to access IoT core const template = Template.fromStack(stack); template.hasResourceProperties("AWS::IAM::Role", { AssumeRolePolicyDocument: { @@ -550,4 +550,4 @@ test('Test for handling fully qualified iotEndpoint', () => { ] } } }); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts index 0eaed6ecc..90b5c7164 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts @@ -110,13 +110,13 @@ test('Test deployment w/ existing stream', () => { expect(construct.cloudwatchAlarms == null); - // Since createCloudWatchAlars is set to false, no Alarm should exist + // Since createCloudWatchAlarm is set to false, no Alarm should exist template.resourceCountIs('AWS::CloudWatch::Alarm', 0); }); test('Construct accepts additional PutRecord request templates', () => { const stack = new Stack(); - new ApiGatewayToKinesisStreams(stack, 'api-gateway-kinesis-streams ', { + new ApiGatewayToKinesisStreams(stack, 'api-gateway-kinesis-streams', { additionalPutRecordRequestTemplates: { 'text/plain': 'custom-template' } diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json index b25627113..8108502ac 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json @@ -53,7 +53,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -626,4 +626,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json index 4cb3f8ff3..5de730a4e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json @@ -53,7 +53,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -578,4 +578,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json index 4ead90e0f..bbdf26eb8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json @@ -53,7 +53,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -610,4 +610,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json index c59473e94..7037d7e4f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json @@ -53,7 +53,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -614,4 +614,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json index 6418ca233..e154b7aa8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json @@ -187,7 +187,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -629,4 +629,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json index ca87bbb51..500d0accd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json @@ -187,7 +187,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -629,4 +629,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.additional-request-templates.expected.json index fb8b6a00d..a56e9da6a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.additional-request-templates.expected.json @@ -49,7 +49,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -393,4 +393,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json index ff698689f..f42bbea54 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json @@ -102,7 +102,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -403,4 +403,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json index 818f748dc..7ab66b90f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json @@ -49,7 +49,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -392,4 +392,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts index 1b42dfe6a..637bc84ed 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts @@ -220,7 +220,7 @@ test('Queue is encrypted with imported CMK when set on queueProps.encryptionKeyP }); }); -test('Queue is encrypted with provided encrytionKeyProps', () => { +test('Queue is encrypted with provided encryptionKeyProps', () => { const stack = new Stack(); new ApiGatewayToSqs(stack, 'api-gateway-sqs', { encryptionKeyProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.additional-request-templates.expected.json index 32f5d3a15..f50cec09a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.additional-request-templates.expected.json @@ -216,7 +216,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -643,4 +643,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.expected.json index 41bd2c1ca..752ae8ec5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.expected.json @@ -217,7 +217,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -735,4 +735,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.custom-integration-responses.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.custom-integration-responses.expected.json index 1ba7f0556..746f632fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.custom-integration-responses.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.custom-integration-responses.expected.json @@ -215,7 +215,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -542,4 +542,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.existing-queue.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.existing-queue.expected.json index abb0ac42b..fb76a1f8a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.existing-queue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.existing-queue.expected.json @@ -127,7 +127,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -458,4 +458,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.no-arguments.expected.json index e800a3522..4797bac67 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.no-arguments.expected.json @@ -215,7 +215,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -546,4 +546,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json index d5ef6110f..f84b58e71 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json @@ -187,7 +187,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -1104,4 +1104,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json index 634d54238..c8bd96b1b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json @@ -187,7 +187,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -1104,4 +1104,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json index c67b521d0..1c1d7bca1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json @@ -236,7 +236,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -1143,4 +1143,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json index 2f08d62ff..a16dfbfb0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json @@ -187,7 +187,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -1104,4 +1104,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json index 4f4e17671..74bc80b11 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json @@ -187,7 +187,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -1104,4 +1104,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts index e8b4c4fbd..970c32ce2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts @@ -23,7 +23,7 @@ import { Aws } from 'aws-cdk-lib'; */ export interface CloudFrontToMediaStoreProps { /** - * Existing instance of mediastore.CfnContainer obejct. + * Existing instance of mediastore.CfnContainer object. * * @default - None */ diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts index 7f597b5f0..810c7b827 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts @@ -64,7 +64,7 @@ export interface CloudFrontToS3Props { * Optional user provided props to provide an originPath that CloudFront appends to the * origin domain name when CloudFront requests content from the origin. * The string should start with a `/`, for example `/production`. - * @dafault = '/' + * @default = '/' */ readonly originPath?: string, /** diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts index efd18bc1f..4a04f1c22 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts @@ -98,7 +98,7 @@ export class CognitoToApiGatewayToLambda extends Construct { } if (props.apiGatewayProps && (typeof props.apiGatewayProps.proxy !== 'undefined') && (props.apiGatewayProps.proxy === false)) { - defaults.printWarning('For non-proxy API, addAuthorizers() method must be called after all the resources and methods for API are fuly defined. Not calling addAuthorizers() will result in API methods NOT protected by Cognito.'); + defaults.printWarning('For non-proxy API, addAuthorizers() method must be called after all the resources and methods for API are fully defined. Not calling addAuthorizers() will result in API methods NOT protected by Cognito.'); } this.lambdaFunction = defaults.buildLambdaFunction(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json index d66815d6e..5796dedf8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json @@ -186,7 +186,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -713,4 +713,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts index 0c9055654..adb73228e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts @@ -385,7 +385,7 @@ test('Override apiGatewayProps with proxy = false and add POST method', () => { const r = c.apiGateway.root.addResource('foo'); r.addMethod('POST'); - // Super imporant to call this method to Apply the Cognito Authorizers + // Super important to call this method to Apply the Cognito Authorizers c.addAuthorizers(); const template = Template.fromStack(stack); @@ -439,4 +439,4 @@ test('Override apiGatewayProps with proxy = false and add OPTIONS method', () => template.hasResourceProperties('AWS::ApiGateway::Resource', { PathPart: "foo", }); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/README.md b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/README.md index b23bd82eb..c3805fa70 100755 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/README.md @@ -117,7 +117,7 @@ new DynamoDBStreamsToLambdaToElasticSearchAndKibana(this, "test-dynamodb-stream- |createCloudWatchAlarms?|`boolean`|Whether to create recommended CloudWatch alarms| | existingVpc? | [`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An existing VPC in which to deploy the construct. Providing both this and `vpcProps` is an error.| | deployVpc? |`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| -| vpcProps? |[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the Construct, so any values for those properties supplied here will be overrriden. If `deployVpc?` is not `true` then this property will be ignored. | +| vpcProps? |[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the Construct, so any values for those properties supplied here will be overridden. If `deployVpc?` is not `true` then this property will be ignored. | ## Pattern Properties @@ -172,4 +172,4 @@ Out of the box implementation of the Construct without any override will set the ![Architecture Diagram](architecture.png) *** -© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file +© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts index e2602aa4e..e6d4ec2cd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts @@ -85,7 +85,7 @@ export interface FargateToDynamoDBProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts index 0c97a19d2..ebace3548 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts @@ -90,7 +90,7 @@ export interface FargateToEventbridgeProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts index 3cd6c3c6e..c17170209 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts @@ -89,7 +89,7 @@ export interface FargateToKinesisFirehoseProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts index c9365df97..33d8abfdc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts @@ -86,7 +86,7 @@ export interface FargateToOpenSearchProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts index 9d0b29c48..a102ffc5e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts @@ -50,7 +50,7 @@ test('Test domain and cognito domain name', () => { clusterProps: { clusterName: CLUSTER_NAME }, containerDefinitionProps: { CONTAINER_NAME }, fargateTaskDefinitionProps: { family: FAMILY_NAME }, - fargateServiceProps: { servieName: SERVICE_NAME }, + fargateServiceProps: { serviceName: SERVICE_NAME }, openSearchDomainName: DOMAIN_NAME, cognitoDomainName: COGNITO_DOMAIN_NAME }); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts index f57723cbf..02b520da2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts @@ -86,7 +86,7 @@ export interface FargateToS3Props { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts index 3f2ef2551..721ba5a97 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts @@ -85,7 +85,7 @@ export interface FargateToSecretsmanagerProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts index dcf2b3751..a694daada 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts @@ -86,7 +86,7 @@ export interface FargateToSnsProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts index b22d033c9..a556cccee 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/fargate-sns.test.ts @@ -415,7 +415,7 @@ test('Topic is encrypted with imported CMK when set on topicProps.masterKey prop }); }); -test('Topic is encrypted with provided encrytionKeyProps', () => { +test('Topic is encrypted with provided encryptionKeyProps', () => { const stack = new cdk.Stack(undefined, undefined, { env: { account: "123456789012", region: 'us-east-1' }, }); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json index fb0c00d29..72900b528 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json @@ -808,7 +808,7 @@ "rules_to_suppress": [ { "id": "W47", - "reason": "Stub topic for placehoder in Integration test" + "reason": "Stub topic for placeholder in Integration test" } ] } @@ -1188,4 +1188,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts index 96e96a46d..7c3946a6d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts @@ -27,7 +27,7 @@ stack.templateOptions.description = 'Integration Test with existing VPC, Service const existingVpc = getTestVpc(stack); const existingTopic = new sns.Topic(stack, 'test-topic', {}); -addCfnSuppressRules(existingTopic, [ { id: "W47", reason: "Stub topic for placehoder in Integration test" } ]); +addCfnSuppressRules(existingTopic, [ { id: "W47", reason: "Stub topic for placeholder in Integration test" } ]); const image = ecs.ContainerImage.fromRegistry('nginx'); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts index 3dd776d39..de07fe47a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts @@ -86,7 +86,7 @@ export interface FargateToSqsProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts index f614177c3..131728377 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts @@ -552,7 +552,7 @@ test('Queue is encrypted with imported CMK when set on queueProps.encryptionMast }); }); -test('Queue is encrypted with provided encrytionKeyProps', () => { +test('Queue is encrypted with provided encryptionKeyProps', () => { const stack = new cdk.Stack(undefined, undefined, { env: { account: "123456789012", region: 'us-east-1' }, }); @@ -581,7 +581,7 @@ test('Queue is encrypted with provided encrytionKeyProps', () => { }); }); -test('Queue is encrypted with SQS-managed KMS key when no other encryption propreties are set', () => { +test('Queue is encrypted with SQS-managed KMS key when no other encryption properties are set', () => { const stack = new cdk.Stack(undefined, undefined, { env: { account: "123456789012", region: 'us-east-1' }, }); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts index 114694b19..533be3cea 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts @@ -85,7 +85,7 @@ export interface FargateToSsmstringparameterProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts index 9871f2b05..64d238471 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts @@ -88,7 +88,7 @@ export interface FargateToStepfunctionsProps { /** * A Fargate Service already instantiated (probably by another Solutions Construct). If * this is specified, then no props defining a new service can be provided, including: - * existingImageObject, ecrImageVersion, containerDefintionProps, fargateTaskDefinitionProps, + * existingImageObject, ecrImageVersion, containerDefinitionProps, fargateTaskDefinitionProps, * ecrRepositoryArn, fargateServiceProps, clusterProps, existingClusterInterface. If this value * is provided, then existingContainerDefinitionObject must be provided as well. * diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/test.iot-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/test.iot-kinesisstreams.test.ts index 66134bc27..2d295da58 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/test.iot-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/test.iot-kinesisstreams.test.ts @@ -210,7 +210,7 @@ test('check existing action in topic rule props', () => { template.resourceCountIs('AWS::Kinesis::Stream', 2); }); -test('check name confict', () => { +test('check name confect', () => { const stack = new cdk.Stack(); const props: IotToKinesisStreamsProps = { @@ -255,4 +255,4 @@ test('check error when stream props and existing stream is supplied', () => { new IotToKinesisStreams(stack, 'test-iot-kinesisstreams', props); }; expect(app).toThrowError(); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/README.md b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/README.md index 7c988d6d3..df66209e9 100755 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/README.md @@ -121,7 +121,7 @@ new IotToLambdaToDynamoDB(this, "test-iot-lambda-dynamodb-stack", new IotToLambd |existingTableObj?|[`dynamodb.Table`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb.Table.html)|Existing instance of DynamoDB table object, providing both this and `dynamoTableProps` will cause an error.| |tableEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the name of the DynamoDB table. Default: DDB_TABLE_NAME | |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and a Gateway Endpoint will be created in the VPC for Amazon DynamoDB. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| ## Pattern Properties @@ -158,4 +158,4 @@ Out of the box implementation of the Construct without any override will set the ![Architecture Diagram](architecture.png) *** -© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file +© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/iot-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/iot-s3.test.ts index 87dd4a033..ac95bcb04 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/iot-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/iot-s3.test.ts @@ -76,7 +76,7 @@ test('check for default props', () => { expect(construct.iotTopicRule).toBeDefined(); }); -test('check for overriden props', () => { +test('check for overridden props', () => { const stack = new cdk.Stack(); const props: IotToS3Props = { iotTopicRuleProps: { @@ -347,4 +347,4 @@ test('Confirm CHeckS3Props is being called', () => { }; // Assertion expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts index 29074002e..ec1c2b1de 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts @@ -174,7 +174,7 @@ export class KinesisFirehoseToS3 extends Construct { "alias/aws/s3" ); - // We need a stream name to set an enviroment variable, as this is an L1 construct + // We need a stream name to set an environment variable, as this is an L1 construct // accessing the name as a token doesn't work for environment variable contents, so // we take explicit control of the stream name (but will be overridden by a client provided name) const deliveryStreamName = defaults.generateName(this, firehoseId); @@ -189,7 +189,7 @@ export class KinesisFirehoseToS3 extends Construct { deliveryStreamName ); - // if the client didn't explicity say it was a Kinesis client, then turn on encryption + // if the client didn't explicitly say it was a Kinesis client, then turn on encryption if (!props.kinesisFirehoseProps || !props.kinesisFirehoseProps.deliveryStreamType || props.kinesisFirehoseProps.deliveryStreamType !== 'KinesisStreamAsSource' diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/README.md b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/README.md index 4332e90df..9ba008d1d 100755 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/README.md @@ -86,9 +86,9 @@ const customEtlJob = new KinesisstreamsToGluejob(this, "CustomETL", { | tableProps? | [`CfnTableProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_glue.TableProps.html) | User provided AWS Glue Table props to override default props used to create a Glue Table. | | existingDatabase? | [`CfnDatabase`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_glue.CfnDatabase.html) | Existing instance of AWS Glue Database. If this is set, then databaseProps is ignored. | | databaseProps? | [`CfnDatabaseProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_glue.CfnDatabaseProps.html) | User provided Glue Database Props to override the default props used to create the Glue Database. | -| outputDataStore? | [`SinkDataStoreProps`](#sinkdatastoreprops) | User provided properties for S3 bucket that stores Glue Job output. Current datastore types suported is only S3. | +| outputDataStore? | [`SinkDataStoreProps`](#sinkdatastoreprops) | User provided properties for S3 bucket that stores Glue Job output. Current datastore types supported is only S3. | |createCloudWatchAlarms?|`boolean`|Whether to create recommended CloudWatch alarms for Kinesis Data Stream. Default value is set to `true`.| -| etlCodeAsset? | [s3assets.Asset](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_assets.Asset.html) | User provided instance of the Asset class that represents the ETL code on the local filesytem | +| etlCodeAsset? | [s3assets.Asset](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_assets.Asset.html) | User provided instance of the Asset class that represents the ETL code on the local filesystem | ### SinkDataStoreProps diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts index 1b930f7bd..5568a5937 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts @@ -107,7 +107,7 @@ export interface KinesisstreamsToGluejobProps { /** * The props for the Glue database that the construct should use to create. If @database is set * then this property is ignored. If none of @database and @databaseprops is provided, the - * construct will define a GlueDatabase resoruce. + * construct will define a GlueDatabase resource. */ readonly databaseProps?: glue.CfnDatabaseProps; /** @@ -152,8 +152,8 @@ export class KinesisstreamsToGluejob extends Construct { public readonly database: glue.CfnDatabase; public readonly table: glue.CfnTable; /** - * This property is only set if the Glue Job is created by the construct. If an exisiting Glue Job - * configuraton is supplied, the construct does not create an S3 bucket and hence the @outputBucket + * This property is only set if the Glue Job is created by the construct. If an existing Glue Job + * configuration is supplied, the construct does not create an S3 bucket and hence the @outputBucket * property is undefined */ public readonly outputBucket?: [Bucket, (Bucket | undefined)?]; diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json index f7039123d..2c7f16e68 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json @@ -107,7 +107,7 @@ ], "Version": "2012-10-17" }, - "Description": "Service role that Glue custom ETL jobs will assume for exeuction" + "Description": "Service role that Glue custom ETL jobs will assume for execution" } }, "testkinesisstreamslambdaJobRoleDefaultPolicy943FFA49": { @@ -764,4 +764,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json index b11db6096..815e7b32c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json @@ -107,7 +107,7 @@ ], "Version": "2012-10-17" }, - "Description": "Service role that Glue custom ETL jobs will assume for exeuction" + "Description": "Service role that Glue custom ETL jobs will assume for execution" } }, "testkinesisstreamslambdaJobRoleDefaultPolicy943FFA49": { @@ -755,4 +755,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts index e45c954bf..a4a0d75a6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts @@ -74,7 +74,7 @@ test('Pattern minimal deployment', () => { }], Version: "2012-10-17", }, - Description: "Service role that Glue custom ETL jobs will assume for exeuction", + Description: "Service role that Glue custom ETL jobs will assume for execution", }, Type: "AWS::IAM::Role" }); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts index d71a2bc79..9eb56020c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts @@ -142,7 +142,7 @@ export class KinesisStreamsToKinesisFirehoseToS3 extends Construct { } }); - // This Construct requires that the deliveryStreamType be overriden regardless of what is specified in the user props + // This Construct requires that the deliveryStreamType be overridden regardless of what is specified in the user props if (props.kinesisFirehoseProps) { if (props.kinesisFirehoseProps.deliveryStreamType !== undefined) { defaults.printWarning('Overriding deliveryStreamType type to be KinesisStreamAsSource'); @@ -183,4 +183,4 @@ export class KinesisStreamsToKinesisFirehoseToS3 extends Construct { this.cloudwatchAlarms = defaults.buildKinesisStreamCWAlarms(this); } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/README.md index e6713cc03..4e1c2e62e 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/README.md @@ -89,7 +89,7 @@ new LambdaToDynamoDB(this, "test_lambda_dynamodb_stack", new LambdaToDynamoDBPro |tablePermissions?|`string`|Optional table permissions to grant to the Lambda function. One of the following may be specified: `All`, `Read`, `ReadWrite`, `Write`.| |tableEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the name of the DynamoDB table. Default: DDB_TABLE_NAME | |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and a Gateway Endpoint will be created in the VPC for Amazon DynamoDB. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| ## Pattern Properties diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/README.md index a16478bac..67ff61b56 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/README.md @@ -83,7 +83,7 @@ new LambdaToElasticachememcached(this, "LambdaToCachePattern", new LambdaToElast |existingLambdaObj?|[`lambda.Function`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.Function.html)|Existing instance of Lambda Function object, providing both this and `lambdaFunctionProps` will cause an error.| |lambdaFunctionProps?|[`lambda.FunctionProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.FunctionProps.html)|Optional user provided props to override the default props for the Lambda function.| |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for Amazon Elasticache. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user provided properties to override the default properties for the new VPC. `subnetConfiguration` is set by the pattern, so any values for those properties supplied here will be overrriden. | +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user provided properties to override the default properties for the new VPC. `subnetConfiguration` is set by the pattern, so any values for those properties supplied here will be overridden. | | cacheEndpointEnvironmentVariableName?| string | Optional Name for the Lambda function environment variable set to the cache endpoint. Default: CACHE_ENDPOINT | | cacheProps? | [`cache.CfnCacheClusterProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_elasticache.CfnCacheClusterProps.html) | Optional user provided props to override the default props for the Elasticache Cluster. Providing both this and `existingCache` will cause an error. | | existingCache? | [`cache.CfnCacheCluster`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_elasticache.CfnCacheCluster.html#attrconfigurationendpointport) | Existing instance of Elasticache Cluster object, providing both this and `cacheProps` will cause an error. If you provide this, you must provide the associated VPC in existingVpc. | diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/README.md index 149d0d581..972d3818c 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/README.md @@ -114,7 +114,7 @@ new LambdaToElasticSearchAndKibana(this, "sample", |createCloudWatchAlarms?|`boolean`|Whether to create recommended CloudWatch alarms| |domainEndpointEnvironmentVariableName?|`string`|Optional Name for the ElasticSearch domain endpoint environment variable set for the Lambda function.| |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| ## Pattern Properties diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/README.md index f9aa7aaf8..aa6663b1e 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/README.md @@ -88,7 +88,7 @@ new LambdaToEventbridge(this, "LambdaToEventbridgePattern", new LambdaToEventbri |existingEventBusInterface?|[`events.IEventBus`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_events.IEventBus.html)| Optional user-provided custom EventBus for construct to use. Providing both this and `eventBusProps` results an error.| |eventBusProps?|[`events.EventBusProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_events.EventBusProps.html)|Optional user-provided properties to override the default properties when creating a custom EventBus. Setting this value to `{}` will create a custom EventBus using all default properties. If neither this nor `existingEventBusInterface` is provided the construct will use the `default` EventBus. Providing both this and `existingEventBusInterface` results an error.| |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for Amazon EventBridge. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| |eventBusEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the name of the Event bus. Default: EVENTBUS_NAME | diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts index 4b5553ba9..4e2a98672 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts @@ -467,7 +467,7 @@ test('check multiple lambda functions publishing to single event bus', () => { // Make sure 2 lambda functions exist template.resourceCountIs('AWS::Lambda::Function', 2); - // Check whether lambdas have permisison to publish to the event bus + // Check whether lambdas have permission to publish to the event bus template.hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ @@ -499,4 +499,4 @@ test('check multiple lambda functions publishing to single event bus', () => { } } }); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md index 8cae3fe5d..08113c5a3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md @@ -129,4 +129,4 @@ Out of the box implementation of the Construct without any overrides will set th * * * -© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file +© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/achitecture.png b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/architecture.png similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kendra/achitecture.png rename to source/patterns/@aws-solutions-constructs/aws-lambda-kendra/architecture.png diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts index 7f834f4d7..2bb67a540 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts @@ -467,7 +467,7 @@ test('Confirm error with data source with no bucket name', () => { }); }; - expect(app).toThrowError(/Error - an S3 Kendra DataSource requires the DataSourceCofiguration.S3Configuration.bucketName prop/); + expect(app).toThrowError(/Error - an S3 Kendra DataSource requires the DataSourceConfiguration.S3Configuration.bucketName prop/); }); test('Launch with existing vpc', () => { @@ -1045,4 +1045,4 @@ test('Confirm CheckVpcProps is being called', () => { }; // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/README.md index b4f908309..90356dc65 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/README.md @@ -99,7 +99,7 @@ new LambdaToKinesisFirehose(this, "LambdaToFirehosePattern", new LambdaToKinesis |lambdaFunctionProps?|[`lambda.FunctionProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.FunctionProps.html)|Optional user provided props to override the default props for the Lambda function.| |existingKinesisFirehose|[kinesisfirehose.CfnDeliveryStream](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesisfirehose.CfnDeliveryStream.html)|An existing Kinesis Firehose Delivery Stream to which the Lambda function can put data. Note - the delivery stream construct must have already been created and have the deliveryStreamName set. This construct will *not* create a new Delivery Stream.| |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for Amazon Kinesis Data Firehose. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| |firehoseEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the name of the delivery stream. Default: FIREHOSE_DELIVERYSTREAM_NAME | diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/README.md index f3eb9a250..ac642e0af 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/README.md @@ -88,7 +88,7 @@ new LambdaToKinesisStreams(this, "LambdaToKinesisStreams", new LambdaToKinesisSt |kinesisStreamProps?|[`kinesis.StreamProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesis.StreamProps.html)|Optional user-provided props to override the default props for the Kinesis Data Stream.| |createCloudWatchAlarms|`boolean`|Whether to create recommended CloudWatch Alarms (defaults to true).| |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for Amazon Kinesis Streams. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| |streamEnvironmentVariableName?|`string`|Optional Name to override the Lambda Function default environment variable name that holds the Kinesis Data Stream name value. Default: KINESIS_DATASTREAM_NAME | diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/README.md index 911720e6b..40a8fa9d6 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/README.md @@ -86,7 +86,7 @@ new LambdaToS3(this, "LambdaToS3Pattern", new LambdaToS3Props.Builder() |bucketProps?|[`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html)|Optional user provided props to override the default props for the S3 Bucket.| |bucketPermissions?|`string[]`|Optional bucket permissions to grant to the Lambda function. One or more of the following may be specified: `Delete`, `Put`, `Read`, `ReadWrite`, `Write`.| |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for Amazon S3. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| |bucketEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the name of the bucket. Default: S3_BUCKET_NAME | |loggingBucketProps?|[`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html)|Optional user provided props to override the default props for the S3 Logging Bucket.| diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/README.md index fcb6bc26c..4320a0cae 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/README.md @@ -123,12 +123,12 @@ new LambdaToSagemakerEndpoint(this, "LambdaToSagemakerEndpointPattern", |:-------------|:----------------|-----------------| |existingLambdaObj?|[`lambda.Function`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.Function.html)|An optional, existing Lambda function to be used instead of the default function. Providing both this and `lambdaFunctionProps` will cause an error.| |lambdaFunctionProps?|[`lambda.FunctionProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.FunctionProps.html)|Optional user-provided properties to override the default properties for the Lambda function.| -|existingSagemakerEndpointObj?|[`sagemaker.CfnEndpoint`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_sagemaker.CfnEndpoint.html)|An optional, existing SageMaker Enpoint to be used. Providing both this and `endpointProps?` will cause an error.| +|existingSagemakerEndpointObj?|[`sagemaker.CfnEndpoint`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_sagemaker.CfnEndpoint.html)|An optional, existing SageMaker Endpoint to be used. Providing both this and `endpointProps?` will cause an error.| |modelProps?|[`sagemaker.CfnModelProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_sagemaker.CfnModelProps.html) \| `any`|User-provided properties to override the default properties for the SageMaker Model. At least `modelProps?.primaryContainer` must be provided to create a model. By default, the pattern will create a role with the minimum required permissions, but the client can provide a custom role with additional capabilities using `modelProps?.executionRoleArn`.| |endpointConfigProps?|[`sagemaker.CfnEndpointConfigProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_sagemaker.CfnEndpointConfigProps.html)|Optional user-provided properties to override the default properties for the SageMaker Endpoint Config. | |endpointProps?|[`sagemaker.CfnEndpointProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_sagemaker.CfnEndpointProps.html)| Optional user-provided properties to override the default properties for the SageMaker Endpoint Config. | |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this construct should be deployed. When deployed in a VPC, the Lambda function and Sagemaker Endpoint will use ENIs in the VPC to access network resources. An Interface Endpoint will be created in the VPC for Amazon SageMaker Runtime, and Amazon S3 VPC Endpoint. If an existing VPC is provided, the `deployVpc?` property cannot be `true`.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the Construct, so any values for those properties supplied here will be overrriden. If `deployVpc?` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the Construct, so any values for those properties supplied here will be overridden. If `deployVpc?` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| |sagemakerEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the name of the SageMaker endpoint. Default: SAGEMAKER_ENDPOINT_NAME | diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts index 720d316cc..cc733d934 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts @@ -36,7 +36,7 @@ export interface LambdaToSagemakerEndpointProps { */ readonly lambdaFunctionProps?: lambda.FunctionProps; /** - * Existing SageMaker Enpoint object, providing both this and endpointProps will cause an error. + * Existing SageMaker Endpoint object, providing both this and endpointProps will cause an error. * * @default - None */ diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts index 7de4618fc..9ded38670 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts @@ -240,7 +240,7 @@ test('Pattern deployment with new Lambda function, new Sagemaker endpoint, deplo // --------------------------------------------------------------------------------- // Test for error when existing Lambda function does not have vpc and deployVpc = true // --------------------------------------------------------------------------------- -test('Test for errot when existing Lambda function does not have vpc and deployVpc = true ', () => { +test('Test for error when existing Lambda function does not have vpc and deployVpc = true ', () => { // Initial Setup const stack = new Stack(); @@ -286,9 +286,9 @@ test('Pattern deployment with existing Lambda function (with VPC), new Sagemaker }, }); - // Add S3 VPC Gateway Endpint, required by Sagemaker to access Models artifacts via AWS private network + // Add S3 VPC Gateway Endpoint, required by Sagemaker to access Models artifacts via AWS private network defaults.AddAwsServiceEndpoint(stack, vpc, defaults.ServiceEndpointTypes.S3); - // Add SAGEMAKER_RUNTIME VPC Interface Endpint, required by the lambda function to invoke the SageMaker endpoint + // Add SAGEMAKER_RUNTIME VPC Interface Endpoint, required by the lambda function to invoke the SageMaker endpoint defaults.AddAwsServiceEndpoint(stack, vpc, defaults.ServiceEndpointTypes.SAGEMAKER_RUNTIME); // deploy lambda function @@ -372,9 +372,9 @@ test('confirm CheckVpcProps is called', () => { }, }); - // Add S3 VPC Gateway Endpint, required by Sagemaker to access Models artifacts via AWS private network + // Add S3 VPC Gateway Endpoint, required by Sagemaker to access Models artifacts via AWS private network defaults.AddAwsServiceEndpoint(stack, vpc, defaults.ServiceEndpointTypes.S3); - // Add SAGEMAKER_RUNTIME VPC Interface Endpint, required by the lambda function to invoke the SageMaker endpoint + // Add SAGEMAKER_RUNTIME VPC Interface Endpoint, required by the lambda function to invoke the SageMaker endpoint defaults.AddAwsServiceEndpoint(stack, vpc, defaults.ServiceEndpointTypes.SAGEMAKER_RUNTIME); const constructProps: LambdaToSagemakerEndpointProps = { @@ -444,9 +444,9 @@ test('Test getter methods: existing Lambda function (with VPC), new Sagemaker en }, }); - // Add S3 VPC Gateway Endpint, required by Sagemaker to access Models artifacts via AWS private network + // Add S3 VPC Gateway Endpoint, required by Sagemaker to access Models artifacts via AWS private network defaults.AddAwsServiceEndpoint(stack, vpc, defaults.ServiceEndpointTypes.S3); - // Add SAGEMAKER_RUNTIME VPC Interface Endpint, required by the lambda function to invoke the SageMaker endpoint + // Add SAGEMAKER_RUNTIME VPC Interface Endpoint, required by the lambda function to invoke the SageMaker endpoint defaults.AddAwsServiceEndpoint(stack, vpc, defaults.ServiceEndpointTypes.SAGEMAKER_RUNTIME); // deploy lambda function diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/README.md index e3e184713..9ed75c85b 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/README.md @@ -94,7 +94,7 @@ new LambdaToSecretsmanager(this, "test-lambda-secretsmanager-stack", new LambdaT |grantWriteAccess?|`string`|Optional Access granted to the Lambda function for the secret. 'Read' or 'ReadWrite". Default is "Read" |secretEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the ARN of the secret. Default: SECRET_ARN. | |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for AWS Secrets Manager. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| ## Pattern Properties diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts index 9d32421e1..e732df21e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts @@ -70,7 +70,7 @@ export interface LambdaToSecretsmanagerProps { * Optional secret permissions to grant to the Lambda function. * One of the following may be specified: "Read" or "ReadWrite". * - * @default - Read only acess is given to the Lambda function if no value is specified. + * @default - Read only access is given to the Lambda function if no value is specified. */ readonly grantWriteAccess?: string; } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/README.md index d7034ad76..44f691972 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/README.md @@ -86,7 +86,7 @@ new LambdaToSns(this, "test-lambda-sns-stack", new LambdaToSnsProps.Builder() |existingTopicObj?|[`sns.Topic`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.Function.html)|Existing instance of SNS Topic object, providing both this and `topicProps` will cause an error.| |topicProps?|[`sns.TopicProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_sns.TopicProps.html)|Optional user provided properties to override the default properties for the SNS topic.| |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for Amazon SNS. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| |topicArnEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the arn of the topic. Default: SNS_TOPIC_ARN | |topicNameEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the name of the topic. Default: SNS_TOPIC_NAME | diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts index 0b5285e50..d22099b27 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts @@ -410,7 +410,7 @@ test('Topic is encrypted with imported CMK when set on topicProps.masterKey prop }); }); -test('Topic is encrypted with provided encrytionKeyProps', () => { +test('Topic is encrypted with provided encryptionKeyProps', () => { const stack = new Stack(); new LambdaToSns(stack, 'test-construct', { @@ -551,4 +551,4 @@ test('Test that CheckSnsProps is getting called', () => { // Assertion expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/README.md index 5ce3c4efa..4a8ca705b 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/README.md @@ -111,7 +111,7 @@ new LambdaToSqsToLambda(this, "LambdaToSqsToLambdaPattern", new LambdaToSqsToLam |queueEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the URL of the queue. Default: SQS_QUEUE_URL | |sqsEventSourceProps?| [`SqsEventSourceProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_event_sources.SqsEventSourceProps.html)|Optional user provided properties for the queue event source.| |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for Amazon SQS. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| ## Pattern Properties diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/README.md index 502a8123d..ce9e3dbbf 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/README.md @@ -90,7 +90,7 @@ new LambdaToSqs(this, "test-lambda-sqs-stack", new LambdaToSqsProps.Builder() |deadLetterQueueProps?|[`sqs.QueueProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_sqs.QueueProps.html)|Optional user-provided props to override the default props for the dead letter queue. Only used if the `deployDeadLetterQueue` property is set to true.| |maxReceiveCount?|`number`|The number of times a message can be unsuccessfully dequeued before being moved to the dead letter queue. Defaults to `15`.| |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for Amazon SQS. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| |queueEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the URL of the queue. Default: SQS_QUEUE_URL | |enableEncryptionWithCustomerManagedKey?|`boolean`|If no key is provided, this flag determines whether the queue is encrypted with a new CMK or an AWS managed key. This flag is ignored if any of the following are defined: queueProps.encryptionMasterKey, encryptionKey or encryptionKeyProps.| diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts index d71a285bc..d1b6e43ca 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts @@ -321,7 +321,7 @@ test('Queue is encrypted with imported CMK when set on queueProps.encryptionMast }); }); -test('Queue is encrypted with provided encrytionKeyProps', () => { +test('Queue is encrypted with provided encryptionKeyProps', () => { const stack = new Stack(); new LambdaToSqs(stack, 'test-construct', { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/README.md index aed870756..d360c0e7a 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/README.md @@ -102,7 +102,7 @@ new LambdaToSsmstringparameter(this, "test-lambda-ssmstringparameter-stack", |stringParameterProps?|[`ssm.StringParameterProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ssm.StringParameterProps.html)|Optional user provided props to override the default props for SSM String parameter. If existingStringParameterObj is not set stringParameterProps is required. The only supported [`ssm.StringParameterProps.type`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ssm.StringParameterProps.html#type) is [`STRING`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ssm.ParameterType.html#string) if a different value is provided it will be overridden.| |stringParameterEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the name of the parameter. Default: SSM_STRING_PARAMETER_NAME | |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for AWS Systems Manager Parameter. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| |stringParameterPermissions|`string`|Optional SSM String parameter permissions to grant to the Lambda function. One of the following may be specified: "Read", "ReadWrite". diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/README.md index 79294aa63..7d8b983fe 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/README.md @@ -106,7 +106,7 @@ new LambdaToStepfunctions(this, "test-lambda-stepfunctions-stack", |logGroupProps?|[`logs.LogGroupProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_logs.LogGroupProps.html)|User provided props to override the default props for for the CloudWatchLogs LogGroup.| |stateMachineEnvironmentVariableName?|`string`|Optional Name for the Lambda function environment variable set to the ARN of the state machine. Default: STATE_MACHINE_ARN | |existingVpc?|[`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html)|An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources and an Interface Endpoint will be created in the VPC for Amazon Step Functions. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method.| -|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overrriden. If `deployVpc` is not `true` then this property will be ignored.| +|vpcProps?|[`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html)|Optional user-provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored.| |deployVpc?|`boolean`|Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
  • One isolated subnet in each Availability Zone used by the CDK program
  • `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`.| diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md index df299b0b3..804cebaac 100755 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/README.md @@ -20,7 +20,7 @@ ## Overview -This AWS Solutions Construct implements an Amazon API Gateway REST API defined by an OpenAPI specificiation file connected to an AWS Lambda function. +This AWS Solutions Construct implements an Amazon API Gateway REST API defined by an OpenAPI specification file connected to an AWS Lambda function. Here is a minimal deployable pattern definition: @@ -97,7 +97,7 @@ import java.util.Collections; import static software.amazon.awscdk.services.lambda.Runtime.NODEJS_18_X; -final Asset apiDefintionAsset = new Asset(this, "ApiDefinition", AssetProps.builder().path("openapispec.yaml").build()); +final Asset apiDefinitionAsset = new Asset(this, "ApiDefinition", AssetProps.builder().path("openapispec.yaml").build()); final ApiIntegration apiIntegration = ApiIntegration.builder() .id("MessagesHandler") @@ -109,7 +109,7 @@ final ApiIntegration apiIntegration = ApiIntegration.builder() .build(); new OpenApiGatewayToLambda(this, "OpenApiGatewayToLambda", OpenApiGatewayToLambdaProps.builder() - .apiDefinitionAsset(apiDefintionAsset) + .apiDefinitionAsset(apiDefinitionAsset) .apiIntegrations(Collections.singletonList(apiIntegration)) .build()); ``` @@ -218,4 +218,4 @@ Out of the box implementation of the Construct without any override will set the ![Architecture Diagram](architecture.png) *** -© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file +© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json index 1732135d5..ca1dc60f2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json @@ -842,7 +842,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -1030,4 +1030,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json index 8af032032..9061a24b2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json @@ -841,7 +841,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -1029,4 +1029,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json index 1f3a617a5..183f298d9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json @@ -841,7 +841,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -1029,4 +1029,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts index ef1a2cf07..d973cd623 100755 --- a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts @@ -61,7 +61,7 @@ export interface Route53ToApiGatewayProps { /** * An existing AWS Certificate Manager certificate for your custom domain name. * - * @defualt - None + * @default - None */ readonly existingCertificateInterface: certificatemanager.ICertificate; } @@ -147,4 +147,4 @@ export class Route53ToApiGateway extends Construct { throw new Error('Must specify an existingVPC for the Private Hosted Zone in the construct props.'); } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.dummyTest.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.dummyTest.expected.json index 175a173b4..5d969b002 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.dummyTest.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.dummyTest.expected.json @@ -47,7 +47,7 @@ "rules_to_suppress": [ { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource" + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource" } ] } @@ -254,4 +254,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts index d948929a0..b00ccdca5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts @@ -137,7 +137,7 @@ test('Topic is encrypted with imported CMK when set on topicProps.masterKey prop }); }); -test('Topic is encrypted with provided encrytionKeyProps', () => { +test('Topic is encrypted with provided encryptionKeyProps', () => { const stack = new cdk.Stack(); const props: SnsToLambdaProps = { @@ -262,4 +262,4 @@ test('Confirm CheckSnsProps is getting called', () => { // Assertion expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts index 46738ea6b..43bcabc8f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts @@ -182,7 +182,7 @@ test('Queue is encrypted with imported CMK when set on queueProps.encryptionMast }); }); -test('Queue is encrypted with provided encrytionKeyProps', () => { +test('Queue is encrypted with provided encryptionKeyProps', () => { const stack = new Stack(); new SqsToLambda(stack, 'test-construct', { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test-helper.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test-helper.ts index 0422fc53f..3fa2ad9ab 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test-helper.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test-helper.ts @@ -17,17 +17,17 @@ import * as api from "aws-cdk-lib/aws-apigateway"; import { addCfnSuppressRules } from "@aws-solutions-constructs/core"; export function CreateTestApi(stack: Stack, id: string): api.LambdaRestApi { - const lamdaFunction = new lambda.Function(stack, `${id}Function`, { + const lambdaFunction = new lambda.Function(stack, `${id}Function`, { code: lambda.Code.fromAsset(`${__dirname}/lambda`), runtime: lambda.Runtime.NODEJS_16_X, handler: ".handler", }); - addCfnSuppressRules(lamdaFunction, [{ id: "W58", reason: "Test Resource" }]); - addCfnSuppressRules(lamdaFunction, [{ id: "W89", reason: "Test Resource" }]); - addCfnSuppressRules(lamdaFunction, [{ id: "W92", reason: "Test Resource" }]); + addCfnSuppressRules(lambdaFunction, [{ id: "W58", reason: "Test Resource" }]); + addCfnSuppressRules(lambdaFunction, [{ id: "W89", reason: "Test Resource" }]); + addCfnSuppressRules(lambdaFunction, [{ id: "W92", reason: "Test Resource" }]); const restApi = new api.LambdaRestApi(stack, `${id}Api`, { - handler: lamdaFunction, + handler: lambdaFunction, }); const newDeployment = restApi.latestDeployment; diff --git a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts index 3a52a22fb..3ba3363dc 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/apigateway-helper.ts @@ -67,7 +67,7 @@ function configureCloudwatchRoleForApi(scope: Construct, api: apigateway.RestApi addCfnSuppressRules(deployment, [ { id: 'W45', - reason: `ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource` + reason: `ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource` } ]); @@ -397,6 +397,6 @@ export function addProxyMethodToApiResource(params: AddProxyMethodToApiResourceI }; // Setup the API Gateway method - const overridenProps = consolidateProps(defaultMethodOptions, params.methodOptions); - return params.apiResource.addMethod(params.apiMethod, apiGatewayIntegration, overridenProps); + const overriddenProps = consolidateProps(defaultMethodOptions, params.methodOptions); + return params.apiResource.addMethod(params.apiMethod, apiGatewayIntegration, overriddenProps); } \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-defaults.ts b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-defaults.ts index f88b3c467..266fa604d 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-defaults.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-defaults.ts @@ -94,7 +94,7 @@ export function DefaultCloudFrontWebDistributionForS3Props( /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ -export function DefaultCloudFrontDisributionForMediaStoreProps(mediastoreContainer: mediastore.CfnContainer, +export function DefaultCloudFrontDistributionForMediaStoreProps(mediastoreContainer: mediastore.CfnContainer, loggingBucket: s3.Bucket | undefined, originRequestPolicy: cloudfront.OriginRequestPolicy, setHttpSecurityHeaders: boolean, diff --git a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts index 15991ecfe..0bbff36fe 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts @@ -24,7 +24,7 @@ import * as mediastore from 'aws-cdk-lib/aws-mediastore'; import { DefaultCloudFrontWebDistributionForS3Props, DefaultCloudFrontWebDistributionForApiGatewayProps, - DefaultCloudFrontDisributionForMediaStoreProps + DefaultCloudFrontDistributionForMediaStoreProps } from './cloudfront-distribution-defaults'; import { addCfnSuppressRules, consolidateProps } from './utils'; import { createLoggingBucket } from './s3-bucket-helper'; @@ -203,7 +203,7 @@ export function CloudFrontDistributionForMediaStore(scope: Construct, const cloudfrontFunction = getCloudfrontFunction(httpSecurityHeaders, scope); - const defaultprops = DefaultCloudFrontDisributionForMediaStoreProps( + const defaultprops = DefaultCloudFrontDistributionForMediaStoreProps( mediaStoreContainer, loggingBucket, originRequestPolicy, diff --git a/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts index c832c79b8..4036ed44b 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/fargate-helper.ts @@ -62,7 +62,7 @@ export function CreateFargateService( defaults.ServiceEndpointTypes.S3 ); - const constructContainerDefintionProps: any = {}; + const constructContainerDefinitionProps: any = {}; const constructFargateServiceDefinitionProps: any = {}; if (!props.clientFargateServiceProps?.cluster) { @@ -77,7 +77,7 @@ export function CreateFargateService( // Set up the Fargate service if (!props.clientContainerDefinitionProps?.image) { - constructContainerDefintionProps.image = CreateImage( + constructContainerDefinitionProps.image = CreateImage( scope, id, props.ecrRepositoryArn, @@ -92,7 +92,7 @@ export function CreateFargateService( id, props.clientFargateTaskDefinitionProps, props.clientContainerDefinitionProps, - constructContainerDefintionProps + constructContainerDefinitionProps ); constructFargateServiceDefinitionProps.taskDefinition = createTaskDefinitionResponse.taskDefinition; newContainerDefinition = createTaskDefinitionResponse.containerDefinition; @@ -318,4 +318,4 @@ export function getServiceVpcSecurityGroupIds(service: ecs.FargateService): stri service.connections.securityGroups.forEach(element => securityGroupIds.push(element.securityGroupId)); return securityGroupIds; -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts index 068158738..d5e61b6eb 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/glue-job-helper.ts @@ -218,7 +218,7 @@ export function deployGlueJob(scope: Construct, glueJobProps: glue.CfnJobProps, const scriptLocation = newGlueJobProps.command.scriptLocation; // Incoming Props, including scriptLocation, are checked upstream in CheckGlueProps() - const scriptBucketLocation: IBucket = Bucket.fromBucketArn(scope, 'ScriptLocaiton', getS3ArnfromS3Url(scriptLocation!)); + const scriptBucketLocation: IBucket = Bucket.fromBucketArn(scope, 'ScriptLocation', getS3ArnfromS3Url(scriptLocation!)); scriptBucketLocation.grantRead(jobRole); } } @@ -238,7 +238,7 @@ export function deployGlueJob(scope: Construct, glueJobProps: glue.CfnJobProps, export function createGlueJobRole(scope: Construct): Role { return new Role(scope, 'JobRole', { assumedBy: new ServicePrincipal('glue.amazonaws.com'), - description: 'Service role that Glue custom ETL jobs will assume for exeuction', + description: 'Service role that Glue custom ETL jobs will assume for execution', }); } @@ -257,7 +257,7 @@ export function createGlueTable(scope: Construct, database: glue.CfnDatabase, ta * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. * * This method creates an AWS Glue database. The method is only called with an existing Glue database type is not provided. - * The method uses the user provided props to override the defaul props for the Glue database + * The method uses the user provided props to override the default props for the Glue database * * @param scope * @param databaseProps @@ -297,4 +297,4 @@ function isJobCommandProperty(command: glue.CfnJob.JobCommandProperty | IResolva defaults.printWarning('command not of type JobCommandProperty type'); return false; } -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/glue-table-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/glue-table-helper.ts index 447c57a38..077dd3768 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/glue-table-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/glue-table-helper.ts @@ -29,8 +29,8 @@ import { Construct } from "constructs"; * @param fieldSchema * @param sourceType * @param parameters - Key value pairs of parameters. If source type is 'Kinesis', pass Kinesis Data Stream name with key - * as 'STREAM_NAME'. Example: {STREAM_NAME: 'KinesisStreamConstrct.streamName'} + * as 'STREAM_NAME'. Example: {STREAM_NAME: 'KinesisStreamConstruct.streamName'} */ export function DefaultGlueTable(scope: Construct, tableProps: CfnTableProps): CfnTable { return new CfnTable(scope, 'GlueTable', tableProps); -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts index 821552472..3d5a809ee 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/kendra-helper.ts @@ -108,18 +108,18 @@ function CreateS3DataSource(scope: Construct, // the type to remove the union with IResolvable const dataSourceConfig = clientProps.dataSourceConfiguration as kendra.CfnDataSource.DataSourceConfigurationProperty; if (!dataSourceConfig) { - throw new Error('Error - an S3 Kendra DataSource requires an DataSourceCofiguration prop'); + throw new Error('Error - an S3 Kendra DataSource requires an DataSourceConfiguration prop'); } const s3DataSourceConfig = dataSourceConfig.s3Configuration as kendra.CfnDataSource.S3DataSourceConfigurationProperty; if (!s3DataSourceConfig) { - throw new Error('Error - an S3 Kendra DataSource requires an DataSourceCofiguration.S3Configuration prop'); + throw new Error('Error - an S3 Kendra DataSource requires an DataSourceConfiguration.S3Configuration prop'); } // No Bucket name is an error if (!s3DataSourceConfig.bucketName) { - throw new Error('Error - an S3 Kendra DataSource requires the DataSourceCofiguration.S3Configuration.bucketName prop'); + throw new Error('Error - an S3 Kendra DataSource requires the DataSourceConfiguration.S3Configuration.bucketName prop'); } // If there's no role, make a role and put it into defaultProps diff --git a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts index fc2f88838..ebcb5c859 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts @@ -113,7 +113,7 @@ export function deployLambdaFunction(scope: Construct, } }); - // If this Lambda function is going to access resoures in a + // If this Lambda function is going to access resources in a // VPC, then it needs privileges to access an ENI in that VPC if (lambdaFunctionProps.vpc || vpc) { lambdaServiceRole.addToPolicy(new iam.PolicyStatement({ @@ -194,7 +194,7 @@ export function deployLambdaFunction(scope: Construct, /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. * - * A wrapper above Function.addPermision that + * A wrapper above Function.addPermission that * prevents two different calls to addPermission using * the same construct id. */ @@ -236,4 +236,4 @@ export function getLambdaVpcSecurityGroupIds(lambdaFunction: lambda.Function): s lambdaFunction.connections.securityGroups.forEach(element => securityGroupIds.push(element.securityGroupId)); return securityGroupIds; -} \ No newline at end of file +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts index 706bdb785..e835260fd 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts @@ -121,7 +121,7 @@ function addPermissions(role: iam.Role, props?: BuildSagemakerEndpointProps) { ); } - // To create a Sagemaker model using Bring-Your-Own-Model (BYOM) algorith image + // To create a Sagemaker model using Bring-Your-Own-Model (BYOM) algorithm image // The image URL is specified in the modelProps role.addToPolicy( new iam.PolicyStatement({ @@ -325,7 +325,7 @@ function CheckNotebookVpcProps(props: BuildSagemakerNotebookProps): boolean { export interface BuildSagemakerEndpointProps { /** - * Existing Sagemaker Enpoint object, if this is set then the modelProps, endpointConfigProps, and endpointProps are ignored + * Existing Sagemaker Endpoint object, if this is set then the modelProps, endpointConfigProps, and endpointProps are ignored * * @default - None */ diff --git a/source/patterns/@aws-solutions-constructs/core/lib/utils.ts b/source/patterns/@aws-solutions-constructs/core/lib/utils.ts index f0a831993..324bf91ac 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/utils.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/utils.ts @@ -100,7 +100,7 @@ export function printWarning(message: string) { * different stack instances * @param {string[]} parts - the various string components of the name (eg - stackName, solutions construct ID, L2 construct ID) * @param {number} maxLength - the longest string that can be returned - * @returns {string} - a string with concatenated parts (truncated if neccessary) + a hash of the full concatenated parts + * @returns {string} - a string with concatenated parts (truncated if necessary) + a hash of the full concatenated parts * * This is based upon this discussion - https://github.com/aws/aws-cdk/issues/1424 */ @@ -135,7 +135,7 @@ export function generateResourceName( * so it will remain static in multiple updates of a single stack, but will be different in a separate stack instance * @param {string[]} parts - the various string components of the name (eg - stackName, solutions construct ID, L2 construct ID) * @param {number} maxLength - the longest string that can be returned - * @returns {string} - a string with concatenated parts (truncated if neccessary) + a hash of the full concatenated parts + * @returns {string} - a string with concatenated parts (truncated if necessary) + a hash of the full concatenated parts * */ export function generatePhysicalName( diff --git a/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts index 7a5893741..f116c94bc 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts @@ -303,7 +303,7 @@ test('llow the construct to create the job role required', () => { }], Version: "2012-10-17" }, - Description: "Service role that Glue custom ETL jobs will assume for exeuction" + Description: "Service role that Glue custom ETL jobs will assume for execution" } }); }); @@ -514,4 +514,4 @@ test('Cannot use maxCapacity and WorkerType, so error out', () => { } catch (error) { expect(error).toBeInstanceOf(Error); } -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts index a45882639..6d5e007a5 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts @@ -443,7 +443,7 @@ test('Test bad Glue script location', () => { expect(app).toThrowError('Invalid S3 URL for Glue script provided\n'); }); -test('Test missing Glue script lcoation', () => { +test('Test missing Glue script location', () => { const stack = new Stack(); const _jobRole = new iam.Role(stack, 'CustomETLJobRole', { @@ -672,4 +672,4 @@ test('Test unsuccessful CheckListValues', () => { // Assertion expect(app).toThrowError('Invalid test value submitted - three'); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/kendra-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/kendra-helper.test.ts index 8e934d19a..6bec8b6eb 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/kendra-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/kendra-helper.test.ts @@ -30,7 +30,7 @@ test('Launch Kendra index with defaults', () => { template.resourceCountIs("AWS::IAM::Role", 1); }); -test('Confirm kendra has log wrting privileges', () => { +test('Confirm kendra has log writing privileges', () => { const stack = new Stack(undefined, undefined); buildKendraIndex(stack, 'test', {}); @@ -372,7 +372,7 @@ test('Confirm error if does not provide DataSource configuration', () => { AddKendraDataSource(stack, 'test-bad-source', testIndex, dataSourceProps); }; - expect(app).toThrowError(/Error - an S3 Kendra DataSource requires an DataSourceCofiguration prop/); + expect(app).toThrowError(/Error - an S3 Kendra DataSource requires an DataSourceConfiguration prop/); }); test('Confirm error if does not provide S3 DataSource configuration', () => { @@ -392,7 +392,7 @@ test('Confirm error if does not provide S3 DataSource configuration', () => { AddKendraDataSource(stack, 'test-bad-source', testIndex, dataSourceProps); }; - expect(app).toThrowError(/Error - an S3 Kendra DataSource requires an DataSourceCofiguration.S3Configuration prop/); + expect(app).toThrowError(/Error - an S3 Kendra DataSource requires an DataSourceConfiguration.S3Configuration prop/); }); test('Confirm error if does not provide S3 Bucketname', () => { @@ -415,7 +415,7 @@ test('Confirm error if does not provide S3 Bucketname', () => { AddKendraDataSource(stack, 'test-bad-source', testIndex, dataSourceProps); }; - expect(app).toThrowError(/Error - an S3 Kendra DataSource requires the DataSourceCofiguration.S3Configuration.bucketName prop/); + expect(app).toThrowError(/Error - an S3 Kendra DataSource requires the DataSourceConfiguration.S3Configuration.bucketName prop/); }); test('Launch Kendra index with multiple data sources', () => { @@ -552,4 +552,4 @@ test('Confirm successful operation of normalizeKendraPermissions()', () => { }; expect(app).toThrowError(/Invalid indexPermission value - valid values are "READ", "SUBMITFEEDBACK" and "WRITE"/); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts index 99b0c6d99..08e04d178 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts @@ -504,7 +504,7 @@ test('buildLambdaFunction uses constructId when specified', () => { }); }); -// specifying constructId takes precendence over functionName for setting the +// specifying constructId takes precedence over functionName for setting the // underlying lambda function and iam role construct ids. test('buildLambdaFunction uses constructId when both constructId and functionName are specified', () => { const stack = new Stack(); diff --git a/source/patterns/@aws-solutions-constructs/resources/README.md b/source/patterns/@aws-solutions-constructs/resources/README.md index 04bc21a96..08e056c31 100644 --- a/source/patterns/@aws-solutions-constructs/resources/README.md +++ b/source/patterns/@aws-solutions-constructs/resources/README.md @@ -16,6 +16,6 @@ |:-------------|:-------------|
-The resources library contains resuable resources that can be leveraged from solutions constructs. These resources are deployable units with their own sets of integration tests (to contrast them with the solutions constructs `core` library). +The resources library contains reusable resources that can be leveraged from solutions constructs. These resources are deployable units with their own sets of integration tests (to contrast them with the solutions constructs `core` library). -The first resource being published is the `template-writer`, which does automatic text transformation/substiution, implemented as a custom resource, and run as part of a CloudFormation stack Create/Update/Delete lifecycle. Some use-cases for using the `template-writer` resource can be seen in the `aws-openapigateway-lambda` Solutions Construct, where it transforms an incoming OpenAPI Definition (residing locally or in S3) by auto-populating the `uri` fields of the `x-amazon-apigateway-integration` integrations with the resolved value of the backing lambda functions. \ No newline at end of file +The first resource being published is the `template-writer`, which does automatic text transformation/substiution, implemented as a custom resource, and run as part of a CloudFormation stack Create/Update/Delete lifecycle. Some use-cases for using the `template-writer` resource can be seen in the `aws-openapigateway-lambda` Solutions Construct, where it transforms an incoming OpenAPI Definition (residing locally or in S3) by auto-populating the `uri` fields of the `x-amazon-apigateway-integration` integrations with the resolved value of the backing lambda functions. diff --git a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer.expected.json b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer.expected.json index 0a968389b..c6eaa8d8c 100644 --- a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer.expected.json +++ b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer.expected.json @@ -1,5 +1,5 @@ { - "Description": "Integration Test for Tempalte Writer Resource", + "Description": "Integration Test for Template Writer Resource", "Resources": { "TemplateWriterTemplateWriterLambdaRole8C61D206": { "Type": "AWS::IAM::Role", @@ -429,4 +429,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/use_cases/aws-custom-glue-etl/test/integ.gluejob.expected.json b/source/use_cases/aws-custom-glue-etl/test/integ.gluejob.expected.json index 189a79f23..a4f429a37 100644 --- a/source/use_cases/aws-custom-glue-etl/test/integ.gluejob.expected.json +++ b/source/use_cases/aws-custom-glue-etl/test/integ.gluejob.expected.json @@ -110,7 +110,7 @@ ], "Version": "2012-10-17" }, - "Description": "Service role that Glue custom ETL jobs will assume for exeuction" + "Description": "Service role that Glue custom ETL jobs will assume for execution" } }, "CustomETLJobRoleDefaultPolicy564ADEA9": { @@ -766,4 +766,4 @@ ] } } -} \ No newline at end of file +} diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.js.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.js.snap index 7d030bcb2..67b478ac1 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.js.snap +++ b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.js.snap @@ -571,7 +571,7 @@ Object { "rules_to_suppress": Array [ Object { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource", }, ], }, diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.ts.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.ts.snap index 0b0094eb5..4163dd067 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.ts.snap +++ b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/kitchenStaffStack.test.ts.snap @@ -443,7 +443,7 @@ Object { "rules_to_suppress": Array [ Object { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource", }, ], }, diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.js.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.js.snap index c37d27adf..5b598d732 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.js.snap +++ b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.js.snap @@ -583,7 +583,7 @@ Object { "rules_to_suppress": Array [ Object { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource", }, ], }, diff --git a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.ts.snap b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.ts.snap index f91c4e580..5decef574 100644 --- a/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.ts.snap +++ b/source/use_cases/aws-restaurant-management-demo/test/__snapshots__/serviceStaffStack.test.ts.snap @@ -659,7 +659,7 @@ Object { "rules_to_suppress": Array [ Object { "id": "W45", - "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checkes for it in AWS::ApiGateway::Deployment resource", + "reason": "ApiGateway has AccessLogging enabled in AWS::ApiGateway::Stage resource, but cfn_nag checks for it in AWS::ApiGateway::Deployment resource", }, ], }, From 4092f248caf5740fd894d217afbcf710faf60a17 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Tue, 19 Sep 2023 08:42:47 -0400 Subject: [PATCH 50/73] Create CheckLambdaProps (#1012) --- .../aws-alb-lambda/lib/index.ts | 1 + .../aws-alb-lambda/test/alb-lambda.test.ts | 34 +++++++++++++++++ .../aws-apigateway-lambda/lib/index.ts | 1 + .../test/test.apigateway-lambda.test.ts | 35 +++++++++++++++-- .../lib/index.ts | 1 + .../test.cloudfront-apigateway-lambda.test.ts | 25 +++++++++++- .../lib/index.ts | 1 + .../test.cognito-apigateway-lambda.test.ts | 23 +++++++++++ ...treams-lambda-elasticsearch-kibana.test.ts | 24 ++++++++++++ .../aws-dynamodbstreams-lambda/lib/index.ts | 1 + .../test/dynamodbstreams-lambda.test.ts | 24 ++++++++++++ .../aws-eventbridge-lambda/lib/index.ts | 1 + .../test/eventbridge-lambda.test.ts | 31 ++++++++++++++- .../test/iot-lambda-dynamodb.test.ts | 31 +++++++++++++++ .../aws-iot-lambda/lib/index.ts | 1 + .../aws-iot-lambda/test/iot-lambda.test.ts | 34 ++++++++++++++++- .../aws-kinesisstreams-lambda/lib/index.ts | 1 + .../test/kinesisstreams-lambda.test.ts | 38 ++++++++++++------- .../aws-lambda-dynamodb/lib/index.ts | 1 + .../test/lambda-dynamodb.test.ts | 26 ++++++++++++- .../lib/index.ts | 1 + .../test/lambda-elasticachememcached.test.ts | 29 +++++++++++++- .../lib/index.ts | 1 + .../test/lambda-elasticsearch-kibana.test.ts | 25 ++++++++++++ .../aws-lambda-eventbridge/lib/index.ts | 1 + .../test/aws-lambda-eventbridge.test.ts | 24 ++++++++++++ .../aws-lambda-kendra/lib/index.ts | 1 + .../test/lambda-kendra.test.ts | 33 ++++++++++++++++ .../aws-lambda-kinesisfirehose/lib/index.ts | 1 + .../test/aws-lambda-kinesisfirehose.test.ts | 28 +++++++++++++- .../aws-lambda-kinesisstreams/lib/index.ts | 1 + .../test/lambda-kinesisstream.test.ts | 26 ++++++++++++- .../aws-lambda-opensearch/lib/index.ts | 1 + .../test/lambda-opensearch.test.ts | 25 ++++++++++++ .../aws-lambda-s3/lib/index.ts | 1 + .../aws-lambda-s3/test/lambda-s3.test.ts | 26 ++++++++++++- .../aws-lambda-sagemakerendpoint/lib/index.ts | 1 + .../test/aws-lambda-sagemakerendpoint.test.ts | 30 +++++++++++++++ .../aws-lambda-secretsmanager/lib/index.ts | 1 + .../test/lambda-secretsmanager.test.ts | 26 ++++++++++++- .../aws-lambda-sns/lib/index.ts | 1 + .../aws-lambda-sns/test/lambda-sns.test.ts | 24 ++++++++++++ .../test/lambda-sqs-lambda.test.ts | 28 ++++++++++++++ .../aws-lambda-sqs/lib/index.ts | 1 + .../aws-lambda-sqs/test/lambda-sqs.test.ts | 26 ++++++++++++- .../lib/index.ts | 1 + .../test/lambda-ssmstringparameter.test.ts | 27 ++++++++++++- .../aws-lambda-stepfunctions/lib/index.ts | 1 + .../test/lambda-stepfunctions.test.ts | 30 ++++++++++++++- .../aws-openapigateway-lambda/lib/index.ts | 3 ++ .../test/test.openapigateway-lambda.test.ts | 34 +++++++++++++++++ .../aws-s3-lambda/lib/index.ts | 1 + .../aws-s3-lambda/test/s3-lambda.test.ts | 26 ++++++++++++- .../aws-sns-lambda/lib/index.ts | 1 + .../aws-sns-lambda/test/sns-lambda.test.ts | 24 ++++++++++++ .../aws-sqs-lambda/lib/index.ts | 1 + .../test/test.sqs-lambda.test.ts | 26 ++++++++++++- .../core/lib/input-validation.ts | 31 ++++++++++----- .../core/test/input-validation.test.ts | 8 +++- 59 files changed, 867 insertions(+), 43 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts index f8253363e..eaa060887 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts @@ -124,6 +124,7 @@ export class AlbToLambda extends Construct { defaults.CheckProps(props); defaults.CheckAlbProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); // Obtain VPC for construct (existing or created) this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts index 2d629a3d2..0914cbe97 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts @@ -953,6 +953,40 @@ test('Test existingLoadBalancerObj and no existingVpc is an error', () => { /An existing ALB is already in a VPC, that VPC must be provided in props.existingVpc for the rest of the construct to use./); }); +test('Confirm that CheckLambdaProps is called', () => { + const stack = new cdk.Stack(undefined, undefined, { + env: { account: "123456789012", region: 'us-east-1' }, + }); + const testExistingVpc = defaults.getTestVpc(stack); + + const lambdaFunction = new lambda.Function(stack, 'existing-function', { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + functionName: 'name', + vpc: testExistingVpc + }); + + const props: AlbToLambdaProps = { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler' + }, + existingLambdaObj: lambdaFunction, + listenerProps: { + certificates: [defaults.getFakeCertificate(stack, "fake-cert")] + }, + publicApi: false, + existingVpc: testExistingVpc, + }; + const app = () => { + new AlbToLambda(stack, 'new-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); + test('Confirm that CheckVpcProps is called', () => { const stack = new cdk.Stack(undefined, undefined, { env: { account: "123456789012", region: 'us-east-1' }, diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/lib/index.ts index 6a69f86d8..0a1590321 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/lib/index.ts @@ -70,6 +70,7 @@ export class ApiGatewayToLambda extends Construct { constructor(scope: Construct, id: string, props: ApiGatewayToLambdaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckLambdaProps(props); // Setup the Lambda function this.lambdaFunction = defaults.buildLambdaFunction(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts index bb97187d7..4ea4a90b3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts @@ -34,9 +34,6 @@ test('Error on existingLambdaObj=undefined', () => { expect(app).toThrowError(); }); -// -------------------------------------------------------------- -// Test with lambdaFunctionProps. -// -------------------------------------------------------------- test('Test with lambdaFunctionProps', () => { // Initial Setup const stack = new Stack(); @@ -149,4 +146,34 @@ test('Test deployment ApiGateway override cloudWatchRole = false', () => { }); // Assertion 1 defaults.expectNonexistence(stack, "AWS::ApiGateway::Account", {}); -}); \ No newline at end of file +}); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: ApiGatewayToLambdaProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + environment: { + OVERRIDE_STATUS: 'true' + } + }, + existingLambdaObj: lambdaFunction, + apiGatewayProps: { + description: "sampleApiProp" + } + }; + const app = () => { + new ApiGatewayToLambda(stack, 'test-apigateway-lambda', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts index 6af19fa39..db8b3d254 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts @@ -105,6 +105,7 @@ export class CloudFrontToApiGatewayToLambda extends Construct { constructor(scope: Construct, id: string, props: CloudFrontToApiGatewayToLambdaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckLambdaProps(props); this.lambdaFunction = defaults.buildLambdaFunction(this, { existingLambdaObj: props.existingLambdaObj, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts index a44bffeee..aa10fc080 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts @@ -272,4 +272,27 @@ test('Cloudfront logging bucket error when providing existing log bucket and log }; expect(app).toThrowError(); -}); \ No newline at end of file +}); + +test('Confirm CheckLambdaProps is being called', () => { + const stack = new cdk.Stack(); + const existingLambdaObj = new lambda.Function(stack, 'ExistingLambda', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: CloudFrontToApiGatewayToLambdaProps = { + existingLambdaObj, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + } + }; + + const app = () => { + new CloudFrontToApiGatewayToLambda(stack, 'cf-test-apigateway-lambda', props); + }; + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts index 4a04f1c22..d0822f308 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts @@ -82,6 +82,7 @@ export class CognitoToApiGatewayToLambda extends Construct { constructor(scope: Construct, id: string, props: CognitoToApiGatewayToLambdaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckLambdaProps(props); // This Construct requires that the auth type be COGNITO regardless of what is specified in the props if (props.apiGatewayProps) { diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts index adb73228e..ef337275c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts @@ -440,3 +440,26 @@ test('Override apiGatewayProps with proxy = false and add OPTIONS method', () => PathPart: "foo", }); }); + +test('Confirm CheckLambdaProps is being called', () => { + const stack = new cdk.Stack(); + const existingLambdaObj = new lambda.Function(stack, 'ExistingLambda', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: CognitoToApiGatewayToLambdaProps = { + existingLambdaObj, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + } + }; + + const app = () => { + new CognitoToApiGatewayToLambda(stack, 'test-cognito-apigateway-lambda', props); + }; + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts index b084ebdb9..4edab1fce 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts @@ -245,3 +245,27 @@ test('Confirm CheckVpcProps is being called', () => { expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm CheckLambdaProps is being called', () => { + const stack = new cdk.Stack(); + const existingLambdaObj = new lambda.Function(stack, 'ExistingLambda', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: DynamoDBStreamsToLambdaToElasticSearchAndKibanaProps = { + domainName: 'test-name', + existingLambdaObj, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + } + }; + + const app = () => { + new DynamoDBStreamsToLambdaToElasticSearchAndKibana(stack, 'test-apigateway-lambda', props); + }; + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/lib/index.ts index af0077d73..362ccc2cf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/lib/index.ts @@ -83,6 +83,7 @@ export class DynamoDBStreamsToLambda extends Construct { constructor(scope: Construct, id: string, props: DynamoDBStreamsToLambdaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckLambdaProps(props); this.lambdaFunction = defaults.buildLambdaFunction(this, { existingLambdaObj: props.existingLambdaObj, diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/dynamodbstreams-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/dynamodbstreams-lambda.test.ts index 35f54094e..c6922d01a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/dynamodbstreams-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/dynamodbstreams-lambda.test.ts @@ -294,3 +294,27 @@ test('check dynamodb table stream override with ITable', () => { } }); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: DynamoDBStreamsToLambdaProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new DynamoDBStreamsToLambda(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/lib/index.ts index 0594a5da4..f9f052540 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/lib/index.ts @@ -70,6 +70,7 @@ export class EventbridgeToLambda extends Construct { constructor(scope: Construct, id: string, props: EventbridgeToLambdaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckLambdaProps(props); this.lambdaFunction = defaults.buildLambdaFunction(this, { existingLambdaObj: props.existingLambdaObj, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts index b57b2c0a0..12fa1ab48 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts @@ -265,4 +265,33 @@ test('check custom event bus resource with props when deploy:true', () => { template.hasResourceProperties('AWS::Events::EventBus', { Name: `testeventbus` }); -}); \ No newline at end of file +}); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: EventbridgeToLambdaProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + eventRuleProps: { + eventPattern: { + source: ['solutionsconstructs'] + } + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new EventbridgeToLambda(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts index 3e903a09c..e69a46d51 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts @@ -617,6 +617,37 @@ test("Confirm CheckVpcProps is called", () => { expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); +test('Confirm CheckLambdaProps is being called', () => { + const stack = new cdk.Stack(); + const existingLambdaObj = new lambda.Function(stack, 'ExistingLambda', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: IotToLambdaToDynamoDBProps = { + iotTopicRuleProps: { + topicRulePayload: { + ruleDisabled: false, + description: "Processing of DTC messages from the AWS Connected Vehicle Solution.", + sql: "SELECT * FROM 'connectedcar/dtc/#'", + actions: [] + } + }, + existingLambdaObj, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + } + }; + + const app = () => { + new IotToLambdaToDynamoDB(stack, 'test-iot-lambda-ddb', props); + }; + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); + // NOTE: existingTableObj was omitted from the interface for this construct, // so this test cannot be run. Leaving it here so it can be used if/when existingTableObj // is added to the interface diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/lib/index.ts index 16f4a1d7b..ad0dc64d3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/lib/index.ts @@ -58,6 +58,7 @@ export class IotToLambda extends Construct { constructor(scope: Construct, id: string, props: IotToLambdaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckLambdaProps(props); this.lambdaFunction = defaults.buildLambdaFunction(this, { existingLambdaObj: props.existingLambdaObj, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts index 2752a632e..64763d28a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts @@ -315,4 +315,36 @@ test('check deploy = true and no prop', () => { } catch (e) { expect(e).toBeInstanceOf(Error); } -}); \ No newline at end of file +}); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: IotToLambdaProps = { + iotTopicRuleProps: { + topicRulePayload: { + ruleDisabled: false, + description: "Processing of DTC messages from the AWS Connected Vehicle Solution.", + sql: "SELECT * FROM 'connectedcar/dtc/#'", + actions: [] + } + }, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new IotToLambda(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/lib/index.ts index c9d0279a8..ecf0e4b7f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/lib/index.ts @@ -95,6 +95,7 @@ export class KinesisStreamsToLambda extends Construct { constructor(scope: Construct, id: string, props: KinesisStreamsToLambdaProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckLambdaProps(props); // Setup the Kinesis Stream this.kinesisStream = defaults.buildKinesisStream(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts index 5392f5a4c..9935241d0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts @@ -18,9 +18,6 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as kinesis from 'aws-cdk-lib/aws-kinesis'; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Test properties -// -------------------------------------------------------------- test('Test properties', () => { // Initial Setup const stack = new Stack(); @@ -40,9 +37,6 @@ test('Test properties', () => { expect(app.cloudwatchAlarms !== null); }); -// -------------------------------------------------------------- -// Test existing resources -// -------------------------------------------------------------- test('Test existing resources', () => { // Initial Setup const stack = new Stack(); @@ -79,9 +73,6 @@ test('Test existing resources', () => { }); }); -// -------------------------------------------------------------- -// Test sqsDlqQueueProps override -// -------------------------------------------------------------- test('test sqsDlqQueueProps override', () => { const stack = new Stack(); const props: KinesisStreamsToLambdaProps = { @@ -104,9 +95,6 @@ test('test sqsDlqQueueProps override', () => { }); }); -// -------------------------------------------------------------- -// Test properties with no CW Alarms -// -------------------------------------------------------------- test('Test properties with no CW Alarms', () => { // Initial Setup const stack = new Stack(); @@ -125,4 +113,28 @@ test('Test properties with no CW Alarms', () => { expect(app.kinesisStream !== null); // Assertion 3 expect(app.cloudwatchAlarms === null); -}); \ No newline at end of file +}); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: KinesisStreamsToLambdaProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new KinesisStreamsToLambda(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts index 93497d06f..6f3be85a1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts @@ -93,6 +93,7 @@ export class LambdaToDynamoDB extends Construct { defaults.CheckProps(props); defaults.CheckDynamoDBProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); // Other permissions for constructs are accepted as arrays, turning tablePermissions into // an array to use the same validation function. diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts index 1afe7536c..ea3392b25 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts @@ -835,4 +835,28 @@ test('Test that CheckDynamoDBProps is getting called', () => { // Assertion expect(app).toThrowError(/Error - Either provide existingTableObj or dynamoTableProps, but not both.\n/); -}); \ No newline at end of file +}); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToDynamoDBProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToDynamoDB(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts index eded4d6eb..2ef1a3813 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts @@ -94,6 +94,7 @@ export class LambdaToElasticachememcached extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if ((props.existingCache || props.existingLambdaObj) && (!props.existingVpc)) { throw Error('If providing an existing Cache or Lambda Function, you must also supply the associated existingVpc'); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts index f9206d8a9..758c59427 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/lambda-elasticachememcached.test.ts @@ -15,7 +15,7 @@ import * as defaults from "@aws-solutions-constructs/core"; import * as cdk from "aws-cdk-lib"; import * as lambda from "aws-cdk-lib/aws-lambda"; -import { LambdaToElasticachememcached } from "../lib"; +import { LambdaToElasticachememcached, LambdaToElasticachememcachedProps } from "../lib"; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import { Template } from "aws-cdk-lib/assertions"; @@ -392,3 +392,30 @@ test("Test error from existingCache and no VPC", () => { 'Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n' ); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const testVpc = defaults.getTestVpc(stack); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + vpc: testVpc, + }); + + const props: LambdaToElasticachememcachedProps = { + existingVpc: testVpc, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToElasticachememcached(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts index 89efeb10b..7f4254c96 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts @@ -109,6 +109,7 @@ export class LambdaToElasticSearchAndKibana extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (props.vpcProps && !props.deployVpc) { throw new Error("Error - deployVpc must be true when defining vpcProps"); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts index f110786b3..767deaa05 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/lambda-elasticsearch-kibana.test.ts @@ -586,3 +586,28 @@ test('Confirm CheckVpcProps is being called', () => { expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToElasticSearchAndKibanaProps = { + domainName: 'name', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToElasticSearchAndKibana(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts index be6edde78..03eb1b584 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts @@ -88,6 +88,7 @@ export class LambdaToEventbridge extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (props.deployVpc || props.existingVpc) { this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts index 4e2a98672..246b86b0a 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts @@ -500,3 +500,27 @@ test('check multiple lambda functions publishing to single event bus', () => { } }); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToEventbridgeProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToEventbridge(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts index 331edc378..1f988aa1f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts @@ -106,6 +106,7 @@ export class LambdaToKendra extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (props.kendraIndexProps && props.existingKendraIndexObj) { throw new Error('You may not provide both kendraIndexProps and existingKendraIndexObj'); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts index 2bb67a540..a80ff5355 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/lambda-kendra.test.ts @@ -1046,3 +1046,36 @@ test('Confirm CheckVpcProps is being called', () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToKendraProps = { + kendraDataSourcesProps: [{ + type: 'S3', + dataSourceConfiguration: { + s3Configuration: { + bucketName: 'testBucketName', + } + } + } + ], + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToKendra(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts index 350cdbbc1..d4562a033 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts @@ -84,6 +84,7 @@ export class LambdaToKinesisFirehose extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (!props.deployVpc && props.vpcProps) { throw new Error('Error - If deployVpc is not true, then vpcProps is ignored'); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts index fb02e6b8d..5efbb891f 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts @@ -15,7 +15,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; -import { LambdaToKinesisFirehose } from '../lib'; +import { LambdaToKinesisFirehose, LambdaToKinesisFirehoseProps } from '../lib'; import * as defaults from '@aws-solutions-constructs/core'; import { GetTestFirehoseDestination } from './test-helper'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; @@ -271,3 +271,29 @@ test('Confirm CheckVpcProps() is being called', () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + const destination = GetTestFirehoseDestination(stack, 'test-destination'); + + const props: LambdaToKinesisFirehoseProps = { + existingKinesisFirehose: destination.kinesisFirehose, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToKinesisFirehose(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts index aa8d3a699..895734136 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts @@ -97,6 +97,7 @@ export class LambdaToKinesisStreams extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); // Setup the VPC if (props.deployVpc || props.existingVpc) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts index 5c7312e48..7396c8628 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts @@ -11,7 +11,7 @@ * and limitations under the License. */ -import { LambdaToKinesisStreams } from "../lib"; +import { LambdaToKinesisStreams, LambdaToKinesisStreamsProps } from "../lib"; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as cdk from "aws-cdk-lib"; import * as ec2 from "aws-cdk-lib/aws-ec2"; @@ -577,3 +577,27 @@ test('Confirm CheckVpcProps() is being called', () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToKinesisStreamsProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToKinesisStreams(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts index 9eda22c10..212bf4f45 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts @@ -109,6 +109,7 @@ export class LambdaToOpenSearch extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (props.vpcProps && !props.deployVpc) { throw new Error("Error - deployVpc must be true when defining vpcProps"); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts index 89ed23f15..2533b776a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts @@ -625,3 +625,28 @@ test('Confirm CheckVpcProps is being called', () => { expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToOpenSearchProps = { + openSearchDomainName: 'name', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToOpenSearch(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts index 7db870a07..fb223ca81 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts @@ -117,6 +117,7 @@ export class LambdaToS3 extends Construct { defaults.CheckProps(props); defaults.CheckS3Props(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (props.bucketPermissions) { defaults.CheckListValues(['Delete', 'Put', 'Read', 'ReadWrite', 'Write'], props.bucketPermissions, 'bucket permission'); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts index 2ddabc047..400ba7b44 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts @@ -16,7 +16,7 @@ import { Stack, RemovalPolicy } from "aws-cdk-lib"; import * as lambda from "aws-cdk-lib/aws-lambda"; import * as ec2 from "aws-cdk-lib/aws-ec2"; import * as s3 from "aws-cdk-lib/aws-s3"; -import { LambdaToS3 } from '../lib'; +import { LambdaToS3, LambdaToS3Props } from '../lib'; import * as defaults from '@aws-solutions-constructs/core'; import { Template } from 'aws-cdk-lib/assertions'; @@ -428,3 +428,27 @@ test("Confirm that CheckVpcProps is being called", () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToS3Props = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToS3(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts index cc733d934..e8a2e5326 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts @@ -107,6 +107,7 @@ export class LambdaToSagemakerEndpoint extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (props.deployVpc || props.existingVpc) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts index 9ded38670..3dfc24519 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts @@ -592,3 +592,33 @@ test('Test lambda function custom environment variable', () => { } }); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToSagemakerEndpointProps = { + modelProps: { + primaryContainer: { + image: '.dkr.ecr..amazonaws.com/linear-learner:latest', + modelDataUrl: 's3:////model.tar.gz', + }, + }, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToSagemakerEndpoint(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts index e732df21e..4819539af 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts @@ -94,6 +94,7 @@ export class LambdaToSecretsmanager extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (props.deployVpc || props.existingVpc) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts index 5855b3e0f..4c752bd7d 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts @@ -16,7 +16,7 @@ import { RemovalPolicy, Stack } from "aws-cdk-lib"; import * as lambda from "aws-cdk-lib/aws-lambda"; import { Secret } from 'aws-cdk-lib/aws-secretsmanager'; import * as ec2 from "aws-cdk-lib/aws-ec2"; -import { LambdaToSecretsmanager } from '../lib'; +import { LambdaToSecretsmanager, LambdaToSecretsmanagerProps } from '../lib'; import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from "@aws-solutions-constructs/core"; @@ -395,3 +395,27 @@ test('Test overriding secretProps to pass a customer provided CMK', () => { EnableKeyRotation: true }); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToSecretsmanagerProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToSecretsmanager(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts index 16839ca9e..0f0612790 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts @@ -116,6 +116,7 @@ export class LambdaToSns extends Construct { defaults.CheckProps(props); defaults.CheckSnsProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (props.deployVpc || props.existingVpc) { this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts index d22099b27..f7ac58de7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/lambda-sns.test.ts @@ -552,3 +552,27 @@ test('Test that CheckSnsProps is getting called', () => { // Assertion expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToSnsProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToSns(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts index e845a9d6e..2c049c915 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/lambda-sqs-lambda.test.ts @@ -626,3 +626,31 @@ test('Confirm CheckSqsProps is being called', () => { }; expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); }); + +test('Confirm CheckLambdaProps is being called', () => { + const stack = new Stack(); + const existingLambdaObj = new lambda.Function(stack, 'ExistingLambda', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToSqsToLambdaProps = { + existingProducerLambdaObj: existingLambdaObj, + producerLambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + consumerLambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + }; + + const app = () => { + new LambdaToSqsToLambda(stack, 'test-lambda-sqs-lambda', props); + }; + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts index 9ab738b04..7f8710fcc 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts @@ -134,6 +134,7 @@ export class LambdaToSqs extends Construct { defaults.CheckProps(props); defaults.CheckSqsProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); if (props.deployVpc || props.existingVpc) { this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts index d1b6e43ca..2942a5d6b 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/lambda-sqs.test.ts @@ -17,7 +17,7 @@ import * as sqs from 'aws-cdk-lib/aws-sqs'; import * as kms from 'aws-cdk-lib/aws-kms'; import * as lambda from "aws-cdk-lib/aws-lambda"; import * as ec2 from "aws-cdk-lib/aws-ec2"; -import { LambdaToSqs } from '../lib'; +import { LambdaToSqs, LambdaToSqsProps } from '../lib'; import { Template } from 'aws-cdk-lib/assertions'; test('Test the properties', () => { @@ -510,3 +510,27 @@ test('Confirm CheckSqsProps is being called', () => { }; expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToSqsProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToSqs(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts index ee603b8ca..0ae04d0b5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts @@ -96,6 +96,7 @@ export class LambdaToSsmstringparameter extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); // This should have been an array, we will make it an array for validation if (props.stringParameterPermissions) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts index 9be560701..33609ffaf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/lambda-ssmstringparameter.test.ts @@ -15,7 +15,7 @@ import { Stack } from "aws-cdk-lib"; import * as lambda from "aws-cdk-lib/aws-lambda"; import * as ec2 from "aws-cdk-lib/aws-ec2"; -import { LambdaToSsmstringparameter } from '../lib'; +import { LambdaToSsmstringparameter, LambdaToSsmstringparameterProps } from '../lib'; import { Template } from 'aws-cdk-lib/assertions'; import { StringParameter } from "aws-cdk-lib/aws-ssm"; import * as defaults from "@aws-solutions-constructs/core"; @@ -364,3 +364,28 @@ test("Test bad call with invalid string parameter permission", () => { // Assertion expect(app).toThrowError('Invalid String Parameter permission submitted - Reed'); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: LambdaToSsmstringparameterProps = { + stringParameterProps: { stringValue: "test-string-value" }, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToSsmstringparameter(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts index 6761f39f9..e592e85d9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts @@ -99,6 +99,7 @@ export class LambdaToStepfunctions extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckVpcProps(props); + defaults.CheckLambdaProps(props); // Setup vpc if (props.deployVpc || props.existingVpc) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts index 5bbd23157..b1d14f0c1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/lambda-stepfunctions.test.ts @@ -17,7 +17,7 @@ import * as lambda from "aws-cdk-lib/aws-lambda"; import * as defaults from '@aws-solutions-constructs/core'; import * as stepfunctions from 'aws-cdk-lib/aws-stepfunctions'; import * as ec2 from "aws-cdk-lib/aws-ec2"; -import { LambdaToStepfunctions } from '../lib'; +import { LambdaToStepfunctions, LambdaToStepfunctionsProps } from '../lib'; import { Template } from "aws-cdk-lib/assertions"; test('Test deployment with new Lambda function', () => { @@ -440,3 +440,31 @@ test("Confirm CheckVpcProps is called", () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const startState = new stepfunctions.Pass(stack, 'StartState'); + const props: LambdaToStepfunctionsProps = { + stateMachineProps: { + definition: startState + }, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new LambdaToStepfunctions(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts index 1261fde3d..e237dcda4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts @@ -164,6 +164,9 @@ export class OpenApiGatewayToLambda extends Construct { let lambdaCounter = 0; this.apiLambdaFunctions = props.apiIntegrations.map(apiIntegration => { + if (apiIntegration.existingLambdaObj && apiIntegration.lambdaFunctionProps) { + throw new Error(`Error - Cannot provide both lambdaFunctionProps and existingLambdaObj in an ApiIntegrationfor the api integration with id: ${apiIntegration.id}`); + } if (apiIntegration.existingLambdaObj || apiIntegration.lambdaFunctionProps) { return { id: apiIntegration.id, diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts index 5f80a68ea..82baf379d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/test.openapigateway-lambda.test.ts @@ -438,3 +438,37 @@ test('Confirm API definition uri is added to function name', () => { })).toBeTruthy(); }); + +test('Confirm that providing both lambdaFunction and functionProps is an error', () => { + const stack = new Stack(); + const existingLambdaObj = new lambda.Function(stack, 'ExistingLambda', { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + functionName: 'ExistingLambdaFunction', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + }); + + const apiDefinitionAsset = new Asset(stack, 'OpenApiAsset', { + path: path.join(__dirname, 'openapi/apiDefinition.yaml') + }); + + const props = { + apiDefinitionAsset, + apiIntegrations: [ + { + id: 'MessagesHandler', + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/messages-lambda`), + }, + existingLambdaObj + } + ] + }; + + const app = () => { + new OpenApiGatewayToLambda(stack, 'test-apigateway-lambda', props); + }; + expect(app).toThrowError(`Error - Cannot provide both lambdaFunctionProps and existingLambdaObj in an ApiIntegrationfor the api integration with id: MessagesHandler`); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts index e65cc9743..74b2296f5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts @@ -91,6 +91,7 @@ export class S3ToLambda extends Construct { defaults.CheckProps(props); defaults.CheckS3Props(props); + defaults.CheckLambdaProps(props); let bucket: s3.Bucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts index e09f9f0a3..31191b050 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts @@ -135,4 +135,28 @@ test('check properties with existing S3 bucket', () => { expect(construct.s3Bucket).toEqual(undefined); expect(construct.s3BucketInterface).not.toEqual(undefined); expect(construct.s3LoggingBucket).toEqual(undefined); -}); \ No newline at end of file +}); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: S3ToLambdaProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new S3ToLambda(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts index 702c88eff..d1c959d83 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts @@ -87,6 +87,7 @@ export class SnsToLambda extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckSnsProps(props); + defaults.CheckLambdaProps(props); // Setup the Lambda function this.lambdaFunction = defaults.buildLambdaFunction(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts index b00ccdca5..96aa19afb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts @@ -263,3 +263,27 @@ test('Confirm CheckSnsProps is getting called', () => { // Assertion expect(app).toThrowError(/Error - Either provide topicProps or existingTopicObj, but not both.\n/); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: SnsToLambdaProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new SnsToLambda(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts index 0b45c93c0..f07c49626 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts @@ -113,6 +113,7 @@ export class SqsToLambda extends Construct { super(scope, id); defaults.CheckProps(props); defaults.CheckSqsProps(props); + defaults.CheckLambdaProps(props); // Setup the Lambda function this.lambdaFunction = defaults.buildLambdaFunction(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts index 43bcabc8f..e7ae16a1c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts @@ -65,7 +65,7 @@ test('Test getter methods', () => { maxReceiveCount: 0, queueProps: {} }; - const app = new SqsToLambda(stack, 'test-apigateway-lambda', props); + const app = new SqsToLambda(stack, 'sqs-lambda', props); // Assertion 1 expect(app.lambdaFunction !== null); // Assertion 2 @@ -286,3 +286,27 @@ test('Confirm CheckSqsProps is called', () => { }; expect(app).toThrowError("Error - Either provide queueProps or existingQueueObj, but not both.\n"); }); + +test('Confirm call to CheckLambdaProps', () => { + // Initial Setup + const stack = new Stack(); + const lambdaFunction = new lambda.Function(stack, 'a-function', { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }); + + const props: SqsToLambdaProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingLambdaObj: lambdaFunction, + }; + const app = () => { + new SqsToLambda(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts index 87aaad8e1..f5fd38b43 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts @@ -37,9 +37,6 @@ export interface VerifiedProps { readonly existingStreamObj?: kinesis.Stream; readonly kinesisStreamProps?: kinesis.StreamProps, - readonly existingLambdaObj?: lambda.Function, - readonly lambdaFunctionProps?: lambda.FunctionProps, - readonly existingMediaStoreContainerObj?: mediastore.CfnContainer; readonly mediaStoreContainerProps?: mediastore.CfnContainerProps; @@ -86,11 +83,6 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } - if (propsObject.existingLambdaObj && propsObject.lambdaFunctionProps) { - errorMessages += 'Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'; - errorFound = true; - } - if (propsObject.existingMediaStoreContainerObj && propsObject.mediaStoreContainerProps) { errorMessages += 'Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n'; errorFound = true; @@ -347,13 +339,32 @@ export function CheckVpcProps(propsObject: VpcProps | any) { } } +export interface LambdaProps { + readonly existingLambdaObj?: lambda.Function, + readonly lambdaFunctionProps?: lambda.FunctionProps, +} + +export function CheckLambdaProps(propsObject: LambdaProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingLambdaObj && propsObject.lambdaFunctionProps) { + errorMessages += 'Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} + // export interface DynamoDBProps { // } - +// // export function CheckDynamoDBProps(propsObject: GlueProps | any) { // let errorMessages = ''; // let errorFound = false; - +// // if (errorFound) { // throw new Error(errorMessages); // } diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts index 6d5e007a5..9eeccb23b 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts @@ -70,10 +70,13 @@ test('Test fail DynamoDB table check (for interface)', () => { expect(app).toThrowError('Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'); }); +// --------------------------- +// Lambda Prop Tests +// --------------------------- test("Test fail Lambda function check", () => { const stack = new Stack(); - const props: defaults.VerifiedProps = { + const props: defaults.LambdaProps = { lambdaFunctionProps: { code: lambda.Code.fromAsset(`${__dirname}/lambda`), runtime: lambda.Runtime.NODEJS_16_X, @@ -87,7 +90,7 @@ test("Test fail Lambda function check", () => { }; const app = () => { - defaults.CheckProps(props); + defaults.CheckLambdaProps(props); }; // Assertion @@ -95,6 +98,7 @@ test("Test fail Lambda function check", () => { "Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n" ); }); +// --------------------------- // --------------------------- // DynamoDB Prop Tests From 7405ed6bdaff4b7393e03042cce5f37e29ab8739 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Tue, 19 Sep 2023 13:18:19 -0400 Subject: [PATCH 51/73] Move Alb Prop checks (#1013) --- .../aws-alb-fargate/test/alb-fargate.test.ts | 35 ++++++++++++++ .../aws-alb-lambda/test/alb-lambda.test.ts | 39 +++++++++++++++ .../aws-route53-alb/test/route53-alb.test.ts | 3 +- .../aws-wafwebacl-alb/lib/index.ts | 1 + .../core/lib/alb-helper.ts | 10 ++++ .../core/lib/input-validation.ts | 29 ----------- .../core/test/alb-helper.test.ts | 48 +++++++++++++++++++ .../core/test/input-validation.test.ts | 4 +- 8 files changed, 137 insertions(+), 32 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts index ab0664025..3bd238d69 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/alb-fargate.test.ts @@ -484,3 +484,38 @@ test('Confirm that CheckVpcProps is called', () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm that CheckAlbProps is called', () => { + const stack = new cdk.Stack(undefined, undefined, { + env: { account: "123456789012", region: 'us-east-1' }, + }); + const testName = 'test-value'; + + const existingVpc = defaults.getTestVpc(stack); + + const existingAlb = new elb.ApplicationLoadBalancer(stack, 'test-alb', { + vpc: existingVpc, + internetFacing: true, + loadBalancerName: testName, + }); + + const props: AlbToFargateProps = { + existingVpc, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + listenerProps: { + certificates: [defaults.getFakeCertificate(stack, "fake-cert")] + }, + publicApi: false, + vpcProps: {}, + loadBalancerProps: { + loadBalancerName: 'new-loadbalancer', + internetFacing: true, + }, + existingLoadBalancerObj: existingAlb, + }; + const app = () => { + new AlbToFargate(stack, 'new-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide loadBalancerProps or existingLoadBalancerObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts index 0914cbe97..366e532e6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts @@ -1011,3 +1011,42 @@ test('Confirm that CheckVpcProps is called', () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm that CheckAlbProps is called', () => { + const stack = new cdk.Stack(undefined, undefined, { + env: { account: "123456789012", region: 'us-east-1' }, + }); + const testName = 'test-value'; + + const existingVpc = defaults.getTestVpc(stack); + + const existingAlb = new elb.ApplicationLoadBalancer(stack, 'test-alb', { + vpc: existingVpc, + internetFacing: true, + loadBalancerName: testName, + }); + + const props: AlbToLambdaProps = { + existingVpc, + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler' + }, + listenerProps: { + certificates: [defaults.getFakeCertificate(stack, "fake-cert")] + }, + publicApi: false, + vpcProps: {}, + loadBalancerProps: { + loadBalancerName: 'new-loadbalancer', + internetFacing: true, + }, + existingLoadBalancerObj: existingAlb, + }; + const app = () => { + new AlbToLambda(stack, 'new-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide loadBalancerProps or existingLoadBalancerObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/route53-alb.test.ts b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/route53-alb.test.ts index d1747bc10..5c6a0b098 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/route53-alb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/route53-alb.test.ts @@ -247,6 +247,7 @@ test('Check that passing an existing hosted Zone without passing an existingVPC }); test('Check that passing an existing Load Balancer without passing an existingVPC is an error', () => { + // This also confirms CheckAlbProps is properly working const stack = new Stack(); const testExistingVpc = defaults.getTestVpc(stack); @@ -267,7 +268,7 @@ test('Check that passing an existing Load Balancer without passing an existingVP new Route53ToAlb(stack, 'test-error', props); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError("An existing ALB already exists in a VPC, so that VPC must be passed to the construct in props.existingVpc"); }); diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts index d37c75e8b..b6cee9a87 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts @@ -54,6 +54,7 @@ export class WafwebaclToAlb extends Construct { constructor(scope: Construct, id: string, props: WafwebaclToAlbProps) { super(scope, id); defaults.CheckProps(props); + // CheckAlbProps() not called because this only accepts and existing Load Balancer // Build the Web ACL this.webacl = defaults.buildWebacl(this, 'REGIONAL', { diff --git a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts index 8887608c6..7080449cc 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts @@ -219,6 +219,16 @@ export function CheckAlbProps(props: any) { let errorMessages = ''; let errorFound = false; + if (props.loadBalancerProps && props.existingLoadBalancerObj) { + errorMessages += 'Error - Either provide loadBalancerProps or existingLoadBalancerObj, but not both.\n'; + errorFound = true; + } + + if ((props?.logAlbAccessLogs === false) && (props.albLoggingBucketProps)) { + errorMessages += 'Error - If logAlbAccessLogs is false, supplying albLoggingBucketProps is invalid.\n'; + errorFound = true; + } + if (props.listenerProps?.certificateArns) { errorMessages += "certificateArns is deprecated. Please supply certificates using props.listenerProps.certificates\n"; errorFound = true; diff --git a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts index f5fd38b43..5335db051 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts @@ -23,7 +23,6 @@ import * as sqs from 'aws-cdk-lib/aws-sqs'; import * as mediastore from 'aws-cdk-lib/aws-mediastore'; import * as s3 from 'aws-cdk-lib/aws-s3'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as elb from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import * as sns from 'aws-cdk-lib/aws-sns'; import * as glue from 'aws-cdk-lib/aws-glue'; import * as sagemaker from 'aws-cdk-lib/aws-sagemaker'; @@ -49,12 +48,6 @@ export interface VerifiedProps { readonly encryptionKey?: kms.Key, readonly encryptionKeyProps?: kms.KeyProps - readonly loadBalancerProps?: elb.ApplicationLoadBalancerProps; - readonly existingLoadBalancerObj?: elb.ApplicationLoadBalancer; - - readonly logAlbAccessLogs?: boolean; - readonly albLoggingBucketProps?: s3.BucketProps; - readonly insertHttpSecurityHeaders?: boolean; readonly responseHeadersPolicyProps?: ResponseHeadersPolicyProps; readonly openSearchDomainProps?: opensearch.CfnDomainProps; @@ -68,16 +61,6 @@ export function CheckProps(propsObject: VerifiedProps | any) { let errorMessages = ''; let errorFound = false; - if (propsObject.loadBalancerProps && propsObject.existingLoadBalancerObj) { - errorMessages += 'Error - Either provide loadBalancerProps or existingLoadBalancerObj, but not both.\n'; - errorFound = true; - } - - if ((propsObject?.logAlbAccessLogs === false) && (propsObject.albLoggingBucketProps)) { - errorMessages += 'Error - If logAlbAccessLogs is false, supplying albLoggingBucketProps is invalid.\n'; - errorFound = true; - } - if (propsObject.existingStreamObj && propsObject.kinesisStreamProps) { errorMessages += 'Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'; errorFound = true; @@ -358,18 +341,6 @@ export function CheckLambdaProps(propsObject: LambdaProps | any) { } } -// export interface DynamoDBProps { -// } -// -// export function CheckDynamoDBProps(propsObject: GlueProps | any) { -// let errorMessages = ''; -// let errorFound = false; -// -// if (errorFound) { -// throw new Error(errorMessages); -// } -// } - /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ diff --git a/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts index cec06de2c..927969687 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/alb-helper.test.ts @@ -549,6 +549,54 @@ test('Test sending listenerProps to existingListener error', () => { expect(app).toThrowError("This load balancer already has a listener, listenerProps may not be specified\n"); }); +test('Test sending loadBalancerProps and existingLoadBalancerObj is an error', () => { + const stack = new Stack(); + + const vpc = defaults.buildVpc(stack, { + defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), + }); + + const existingLoadBalancer = new elb.ApplicationLoadBalancer(stack, 'load-balancer', { + vpc, + internetFacing: true, + loadBalancerName: 'unique-name' + }); + + const props = { + vpc, + existingLoadBalancerObj: existingLoadBalancer, + loadBalancerProps: { + loadBalancerName: 'new-loadbalancer', + vpc, + internetFacing: true + } + }; + + const app = () => { + defaults.CheckAlbProps(props); + }; + + expect(app).toThrowError("Error - Either provide loadBalancerProps or existingLoadBalancerObj, but not both.\n"); +}); + +test('Test sending albLoggingBucketProps when logAlbAccessLogs is false is an error', () => { + + const props = { + logAlbAccessLogs: false, + albLoggingBucketProps: {}, + loadBalancerProps: { + loadBalancerName: 'new-loadbalancer', + internetFacing: true + } + }; + + const app = () => { + defaults.CheckAlbProps(props); + }; + + expect(app).toThrowError("Error - If logAlbAccessLogs is false, supplying albLoggingBucketProps is invalid.\n"); +}); + test('Test sending VPC in loadBalancerProps error', () => { const props = { loadBalancerProps: { diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts index 9eeccb23b..0e760905e 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts @@ -101,7 +101,7 @@ test("Test fail Lambda function check", () => { // --------------------------- // --------------------------- -// DynamoDB Prop Tests +// SQS Prop Tests // --------------------------- test("Test fail SQS Queue check", () => { const stack = new Stack(); @@ -547,7 +547,7 @@ test('Test fail encryption key check', () => { }); // --------------------------- -// S3 Prop Tests +// VPC Prop Tests // --------------------------- test('Test fail Vpc check with deployVpc', () => { const stack = new Stack(); From 035ea20d42f2491403d363f937e05e50bb0da6ef Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Wed, 20 Sep 2023 09:04:30 -0400 Subject: [PATCH 52/73] Two more CheckProps functions (#1014) --- .../aws-cloudfront-mediastore/lib/index.ts | 1 + .../test/cloudfront-mediastore.test.ts | 18 ++++++ .../aws-lambda-sagemakerendpoint/lib/index.ts | 1 + .../test/aws-lambda-sagemakerendpoint.test.ts | 28 +++++++++ .../aws-openapigateway-lambda/lib/index.ts | 47 ++++++++++----- .../core/lib/alb-helper.ts | 20 ++++--- .../core/lib/input-validation.ts | 58 +++++++++++++------ .../core/test/input-validation.test.ts | 12 ++-- 8 files changed, 140 insertions(+), 45 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts index 970c32ce2..3adca9492 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts @@ -88,6 +88,7 @@ export class CloudFrontToMediaStore extends Construct { constructor(scope: Construct, id: string, props: CloudFrontToMediaStoreProps) { super(scope, id); defaults.CheckProps(props); + defaults.CheckMediaStoreProps(props); let cloudFrontDistributionProps = props.cloudFrontDistributionProps; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts index 73363676c..5903d9340 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts @@ -700,4 +700,22 @@ test('Cloudfront logging bucket error when providing existing log bucket and log }; expect(app).toThrowError(); +}); + +test('Confirm CheckMediaStoreProps is called', () => { + const stack = new Stack(); + + const mediaStoreContainer = new mediastore.CfnContainer(stack, 'MyMediaStoreContainer', { + containerName: 'MyMediaStoreContainer' + }); + const props = { + existingMediaStoreContainerObj: mediaStoreContainer, + mediaStoreContainerProps: { containerName: 'test' } + }; + + const app = () => { + new CloudFrontToMediaStore(stack, 'cloudfront-s3', props); + }; + + expect(app).toThrowError('Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n'); }); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts index e8a2e5326..3b27984e9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts @@ -108,6 +108,7 @@ export class LambdaToSagemakerEndpoint extends Construct { defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); + defaults.CheckSagemakerProps(props); if (props.deployVpc || props.existingVpc) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts index 3dfc24519..ac1eaa3b8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/aws-lambda-sagemakerendpoint.test.ts @@ -622,3 +622,31 @@ test('Confirm call to CheckLambdaProps', () => { // Assertion expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); }); + +test('Confirm call to CheckSagemakerProps', () => { + // Initial Setup + const stack = new Stack(); + const deploySagemakerEndpointResponse = defaults.deploySagemakerEndpoint(stack, { + modelProps: { + primaryContainer: { + image: '.dkr.ecr..amazonaws.com/linear-learner:latest', + modelDataUrl: 's3:////model.tar.gz', + }, + }, + }); + + const props: LambdaToSagemakerEndpointProps = { + existingSagemakerEndpointObj: deploySagemakerEndpointResponse.endpoint, + endpointProps: { endpointConfigName: 'test' }, + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + }; + const app = () => { + new LambdaToSagemakerEndpoint(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts index e237dcda4..06a7c4a40 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/lib/index.ts @@ -144,22 +144,11 @@ export class OpenApiGatewayToLambda extends Construct { constructor(scope: Construct, id: string, props: OpenApiGatewayToLambdaProps) { super(scope, id); - - if (props.apiDefinitionAsset && (props.apiDefinitionBucket || props.apiDefinitionKey)) { - throw new Error('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified, but not both'); - } + CheckOpenapiProps(props); const apiDefinitionBucket = props.apiDefinitionBucket ?? props.apiDefinitionAsset?.bucket; const apiDefinitionKey = props.apiDefinitionKey ?? props.apiDefinitionAsset?.s3ObjectKey; - if (apiDefinitionBucket === undefined || apiDefinitionKey === undefined) { - throw new Error('Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified'); - } - - if (props.apiIntegrations === undefined || props.apiIntegrations.length < 1) { - throw new Error('At least one ApiIntegration must be specified in the apiIntegrations property'); - } - // store a counter to be able to uniquely name lambda functions to avoid naming collisions let lambdaCounter = 0; @@ -196,8 +185,9 @@ export class OpenApiGatewayToLambda extends Construct { // This custom resource will overwrite the string placeholders in the openapi definition with the resolved values of the lambda URIs const apiDefinitionWriter = resources.createTemplateWriterCustomResource(this, 'Api', { - templateBucket: apiDefinitionBucket, - templateKey: apiDefinitionKey, + // CheckAlbProps() has confirmed the existence of these values + templateBucket: apiDefinitionBucket!, + templateKey: apiDefinitionKey!, templateValues: apiIntegrationUris, timeout: props.internalTransformTimeout ?? cdk.Duration.minutes(1), memorySize: props.internalTransformMemorySize ?? 1024 @@ -229,3 +219,32 @@ export class OpenApiGatewayToLambda extends Construct { }); } } + +function CheckOpenapiProps(props: OpenApiGatewayToLambdaProps) { + + let errorMessages = ''; + let errorFound = false; + + if (props.apiDefinitionAsset && (props.apiDefinitionBucket || props.apiDefinitionKey)) { + errorMessages += 'Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified, but not both\n'; + errorFound = true; + } + + const apiDefinitionBucket = props.apiDefinitionBucket ?? props.apiDefinitionAsset?.bucket; + const apiDefinitionKey = props.apiDefinitionKey ?? props.apiDefinitionAsset?.s3ObjectKey; + + if (apiDefinitionBucket === undefined || apiDefinitionKey === undefined) { + errorMessages += 'Either apiDefinitionBucket/apiDefinitionKey or apiDefinitionAsset must be specified\n'; + errorFound = true; + } + + if (props.apiIntegrations === undefined || props.apiIntegrations.length < 1) { + errorMessages += 'At least one ApiIntegration must be specified in the apiIntegrations property\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } + +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts index 7080449cc..604edddef 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/alb-helper.ts @@ -234,12 +234,7 @@ export function CheckAlbProps(props: any) { errorFound = true; } - if ( - ((props.existingLoadBalancerObj && - props.existingLoadBalancerObj.listeners.length === 0) || - !props.existingLoadBalancerObj) && - !props.listenerProps - ) { + if (ValidateAddListenerProps(props)) { errorMessages += "When adding the first listener and target to a load balancer, listenerProps must be specified and include at least a certificate or protocol: HTTP\n"; errorFound = true; } @@ -282,4 +277,15 @@ export function CheckAlbProps(props: any) { if (errorFound) { throw new Error(errorMessages); } -} \ No newline at end of file + +} + +function ValidateAddListenerProps(props: any) { + if (((props.existingLoadBalancerObj && + props.existingLoadBalancerObj.listeners.length === 0) || + !props.existingLoadBalancerObj) && + !props.listenerProps) { + return true; + } + return false; +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts index 5335db051..654d73ef1 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts @@ -36,12 +36,6 @@ export interface VerifiedProps { readonly existingStreamObj?: kinesis.Stream; readonly kinesisStreamProps?: kinesis.StreamProps, - readonly existingMediaStoreContainerObj?: mediastore.CfnContainer; - readonly mediaStoreContainerProps?: mediastore.CfnContainerProps; - - readonly existingSagemakerEndpointObj?: sagemaker.CfnEndpoint, - readonly endpointProps?: sagemaker.CfnEndpointProps, - readonly existingSecretObj?: secretsmanager.Secret; readonly secretProps?: secretsmanager.SecretProps; @@ -66,16 +60,6 @@ export function CheckProps(propsObject: VerifiedProps | any) { errorFound = true; } - if (propsObject.existingMediaStoreContainerObj && propsObject.mediaStoreContainerProps) { - errorMessages += 'Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n'; - errorFound = true; - } - - if (propsObject.existingSagemakerEndpointObj && propsObject.endpointProps) { - errorMessages += 'Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'; - errorFound = true; - } - if (propsObject.existingSecretObj && propsObject.secretProps) { errorMessages += 'Error - Either provide secretProps or existingSecretObj, but not both.\n'; errorFound = true; @@ -301,14 +285,14 @@ export function CheckS3Props(propsObject: S3Props | any) { } } -export interface VpcProps { +export interface VpcPropsSet { readonly existingVpc?: ec2.IVpc; readonly vpcProps?: ec2.VpcProps; readonly deployVpc?: boolean; } -export function CheckVpcProps(propsObject: VpcProps | any) { +export function CheckVpcProps(propsObject: VpcPropsSet | any) { let errorMessages = ''; let errorFound = false; @@ -341,6 +325,44 @@ export function CheckLambdaProps(propsObject: LambdaProps | any) { } } +export interface MediaStoreProps { + readonly existingMediaStoreContainerObj?: mediastore.CfnContainer; + readonly mediaStoreContainerProps?: mediastore.CfnContainerProps; +} + +export function CheckMediaStoreProps(propsObject: MediaStoreProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingMediaStoreContainerObj && propsObject.mediaStoreContainerProps) { + errorMessages += 'Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} + +export interface SagemakerProps { + readonly existingSagemakerEndpointObj?: sagemaker.CfnEndpoint, + readonly endpointProps?: sagemaker.CfnEndpointProps, +} + +export function CheckSagemakerProps(propsObject: SagemakerProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingSagemakerEndpointObj && propsObject.endpointProps) { + errorMessages += 'Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} + /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts index 0e760905e..f9a7caf2a 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts @@ -256,13 +256,13 @@ test("Test fail MediaStore container check", () => { MediaStoreContainerProps() ); - const props: defaults.VerifiedProps = { + const props: defaults.MediaStoreProps = { mediaStoreContainerProps: MediaStoreContainerProps(), existingMediaStoreContainerObj: mediaStoreContainer, }; const app = () => { - defaults.CheckProps(props); + defaults.CheckMediaStoreProps(props); }; // Assertion @@ -495,7 +495,7 @@ test('Test fail SageMaker endpoint check', () => { const buildSagemakerEndpointResponse = BuildSagemakerEndpoint(stack, { modelProps }); - const props: defaults.VerifiedProps = { + const props: defaults.SagemakerProps = { existingSagemakerEndpointObj: buildSagemakerEndpointResponse.endpoint, endpointProps: { endpointConfigName: 'placeholder' @@ -503,7 +503,7 @@ test('Test fail SageMaker endpoint check', () => { }; const app = () => { - defaults.CheckProps(props); + defaults.CheckSagemakerProps(props); }; // Assertion @@ -552,7 +552,7 @@ test('Test fail encryption key check', () => { test('Test fail Vpc check with deployVpc', () => { const stack = new Stack(); - const props: defaults.VpcProps = { + const props: defaults.VpcPropsSet = { deployVpc: true, existingVpc: defaults.buildVpc(stack, { defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), @@ -570,7 +570,7 @@ test('Test fail Vpc check with deployVpc', () => { test('Test fail Vpc check with vpcProps', () => { const stack = new Stack(); - const props: defaults.VpcProps = { + const props: defaults.VpcPropsSet = { vpcProps: defaults.DefaultPublicPrivateVpcProps(), existingVpc: defaults.buildVpc(stack, { defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), From 1a15512f17257a763e620a4a26d63531082cef19 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 25 Sep 2023 10:38:01 -0400 Subject: [PATCH 53/73] chore(all): reduce cognitive complexity, distribute prop checking code (#1016) * Finish emptying CheckProps() * Remove CheckProps * Typo * remove stray imports * Distribute and remove input-valdation.test.ts * Remove redundant comments * minor eslint format error --- .../aws-alb-fargate/lib/index.ts | 1 - .../aws-alb-lambda/lib/index.ts | 1 - .../aws-apigateway-dynamodb/lib/index.ts | 2 +- .../test/apigateway-dynamodb.test.ts | 33 +- .../aws-apigateway-iot/lib/index.ts | 1 - .../test/test.apigateway-iot.test.ts | 40 -- .../lib/index.ts | 2 +- .../test/apigateway-kinesisstreams.test.ts | 27 +- .../aws-apigateway-lambda/lib/index.ts | 1 - .../test/test.apigateway-lambda.test.ts | 15 - .../lib/index.ts | 2 +- .../test/apigateway-sagemakerendpoint.test.ts | 6 - .../aws-apigateway-sqs/lib/index.ts | 1 - .../lib/index.ts | 2 +- .../test.cloudfront-apigateway-lambda.test.ts | 31 +- .../aws-cloudfront-apigateway/lib/index.ts | 2 +- .../test/test.cloudfront-apigateway.test.ts | 10 +- .../aws-cloudfront-mediastore/lib/index.ts | 2 +- .../test/cloudfront-mediastore.test.ts | 27 +- .../aws-cloudfront-s3/lib/index.ts | 2 +- .../test/test.cloudfront-s3.test.ts | 35 +- .../lib/index.ts | 1 - .../lib/index.ts | 3 +- .../aws-dynamodbstreams-lambda/lib/index.ts | 1 - .../lib/index.ts | 3 +- .../eventbridge-kinesisfirehose-s3.test.ts | 31 +- .../lib/index.ts | 3 +- .../test/eventbridge-kinesisstreams.test.ts | 35 +- .../aws-eventbridge-lambda/lib/index.ts | 2 +- .../test/eventbridge-lambda.test.ts | 48 +- .../aws-eventbridge-sns/lib/index.ts | 2 +- .../test/eventbridge-sns-topic.test.ts | 4 +- .../aws-eventbridge-sqs/lib/index.ts | 2 +- .../test/eventbridge-sqs-queue.test.ts | 4 +- .../lib/index.ts | 2 +- .../test/eventbridge-stepfunctions.test.ts | 4 +- .../aws-fargate-dynamodb/lib/index.ts | 1 - .../aws-fargate-eventbridge/lib/index.ts | 2 +- .../test/fargate-eventbridge.test.ts | 20 + .../aws-fargate-kinesisfirehose/lib/index.ts | 1 - .../aws-fargate-kinesisstreams/lib/index.ts | 2 +- .../test/fargate-kinesisstreams.test.ts | 27 + .../aws-fargate-opensearch/lib/index.ts | 2 +- .../test/fargate-opensearch.test.ts | 2 +- .../aws-fargate-s3/lib/index.ts | 1 - .../aws-fargate-secretsmanager/lib/index.ts | 2 +- .../test/fargate-secretsmanager.test.ts | 26 + .../aws-fargate-sns/lib/index.ts | 1 - .../aws-fargate-sqs/lib/index.ts | 1 - .../lib/index.ts | 1 - .../aws-fargate-stepfunctions/lib/index.ts | 1 - .../aws-iot-kinesisfirehose-s3/lib/index.ts | 5 +- .../test/test.iot-kinesisfirehose-s3.test.ts | 16 +- .../aws-iot-kinesisstreams/lib/index.ts | 2 +- .../test/test.iot-kinesisstreams.test.ts | 4 +- .../aws-iot-lambda-dynamodb/lib/index.ts | 2 - .../test/iot-lambda-dynamodb.test.ts | 20 +- .../aws-iot-lambda/lib/index.ts | 1 - .../aws-iot-s3/lib/index.ts | 1 - .../aws-iot-sqs/lib/index.ts | 1 - .../aws-iot-sqs/test/iot-sqs.test.ts | 30 - .../lib/index.ts | 2 - .../aws-kinesisfirehose-s3/lib/index.ts | 1 - .../test/kinesisfirehose-s3.test.ts | 12 - .../aws-kinesisstreams-gluejob/lib/index.ts | 2 +- .../test/kinesisstream-gluejob.test.ts | 39 + .../lib/index.ts | 3 +- .../kinesisstreams-kinesisfirehose-s3.test.ts | 16 + .../aws-kinesisstreams-lambda/lib/index.ts | 2 +- .../test/kinesisstreams-lambda.test.ts | 20 + .../aws-lambda-dynamodb/lib/index.ts | 1 - .../lib/index.ts | 1 - .../lib/index.ts | 1 - .../aws-lambda-eventbridge/lib/index.ts | 2 +- .../test/aws-lambda-eventbridge.test.ts | 16 +- .../aws-lambda-kendra/lib/index.ts | 1 - .../aws-lambda-kinesisfirehose/lib/index.ts | 1 - .../aws-lambda-kinesisstreams/lib/index.ts | 2 +- .../test/lambda-kinesisstream.test.ts | 20 + .../aws-lambda-opensearch/lib/index.ts | 2 +- .../test/lambda-opensearch.test.ts | 2 +- .../aws-lambda-s3/lib/index.ts | 1 - .../aws-lambda-sagemakerendpoint/lib/index.ts | 1 - .../aws-lambda-secretsmanager/lib/index.ts | 2 +- .../test/lambda-secretsmanager.test.ts | 26 +- .../aws-lambda-sns/lib/index.ts | 1 - .../aws-lambda-sqs-lambda/lib/index.ts | 2 - .../aws-lambda-sqs/lib/index.ts | 1 - .../lib/index.ts | 1 - .../aws-lambda-stepfunctions/lib/index.ts | 1 - .../aws-route53-alb/lib/index.ts | 2 - .../aws-route53-apigateway/lib/index.ts | 1 - .../aws-s3-lambda/lib/index.ts | 1 - .../aws-s3-sns/lib/index.ts | 1 - .../aws-s3-sqs/lib/index.ts | 1 - .../aws-s3-stepfunctions/lib/index.ts | 1 - .../aws-sns-lambda/lib/index.ts | 1 - .../aws-sns-sqs/lib/index.ts | 1 - .../aws-sqs-lambda/lib/index.ts | 1 - .../aws-wafwebacl-alb/lib/index.ts | 2 +- .../test/test.wafwebacl-alb.test.ts | 7 +- .../aws-wafwebacl-apigateway/lib/index.ts | 2 +- .../test/test.wafwebacl-apigateway.test.ts | 4 +- .../aws-wafwebacl-appsync/lib/index.ts | 2 +- .../test/test.wafwebacl-appsync.test.ts | 7 +- .../aws-wafwebacl-cloudfront/lib/index.ts | 2 +- .../test/test.wafwebacl-cloudfront.test.ts | 4 +- .../@aws-solutions-constructs/core/index.ts | 1 - .../lib/cloudfront-distribution-helper.ts | 19 + .../core/lib/dynamodb-table-helper.ts | 58 +- .../core/lib/eventbridge-helper.ts | 21 +- .../core/lib/glue-table-helper.ts | 46 ++ .../core/lib/input-validation.ts | 375 ---------- .../core/lib/kinesis-streams-helper.ts | 21 +- .../core/lib/lambda-helper.ts | 19 + .../core/lib/mediastore-helper.ts | 21 +- .../core/lib/opensearch-helper.ts | 18 + .../core/lib/s3-bucket-helper.ts | 38 + .../core/lib/sagemaker-helper.ts | 19 + .../core/lib/secretsmanager-helper.ts | 27 +- .../core/lib/sns-helper.ts | 39 + .../core/lib/sqs-helper.ts | 55 +- .../core/lib/utils.ts | 11 + .../core/lib/vpc-helper.ts | 22 +- .../core/lib/waf-helper.ts | 19 + .../cloudfront-distribution-s3-helper.test.ts | 21 + .../core/test/dynamo-table.test.ts | 71 +- .../core/test/eventbridge-helper.test.ts | 22 +- .../core/test/glue-job-helper.test.ts | 101 +++ .../core/test/input-validation.test.ts | 679 ------------------ .../core/test/kinesis-streams-helper.test.ts | 34 +- .../core/test/lambda-helper.test.ts | 29 + .../core/test/mediastore-helper.test.ts | 31 +- .../core/test/s3-bucket.test.ts | 74 +- .../core/test/sagemaker-helper.test.ts | 32 + .../core/test/secretsmanager-helper.test.ts | 26 +- .../core/test/sns-helper.test.ts | 109 +++ .../core/test/sqs-helper.test.ts | 165 +++++ .../core/test/utils.test.ts | 36 + .../core/test/vpc-helper.test.ts | 77 +- .../core/test/waf-helper.test.ts | 57 +- 141 files changed, 1587 insertions(+), 1588 deletions(-) delete mode 100644 source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts delete mode 100644 source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts index c710a9dcb..3b4821b7d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/lib/index.ts @@ -164,7 +164,6 @@ export class AlbToFargate extends Construct { constructor(scope: Construct, id: string, props: AlbToFargateProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckAlbProps(props); defaults.CheckFargateProps(props); defaults.CheckVpcProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts index eaa060887..2dc1315fe 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/lib/index.ts @@ -121,7 +121,6 @@ export class AlbToLambda extends Construct { constructor(scope: Construct, id: string, props: AlbToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckAlbProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts index 4fcd666a5..84cc33e36 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts @@ -203,7 +203,7 @@ export class ApiGatewayToDynamoDB extends Construct { */ constructor(scope: Construct, id: string, props: ApiGatewayToDynamoDBProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckDynamoDBProps(props); if (this.CheckCreateRequestProps(props)) { throw new Error(`The 'allowCreateOperation' property must be set to true when setting any of the following: ` + diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/apigateway-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/apigateway-dynamodb.test.ts index af4b249ae..0596aedff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/apigateway-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/apigateway-dynamodb.test.ts @@ -742,4 +742,35 @@ test('Construct throws error when deleteIntegrationResponses is set and allowDel }); expect(app).toThrowError(/The 'allowDeleteOperation' property must be set to true when setting any of the following: 'deleteRequestTemplate', 'additionalDeleteRequestTemplates', 'deleteIntegrationResponses'/); -}); \ No newline at end of file +}); + +test('Test that CheckDynamoDBProps is getting called', () => { + const stack = new Stack(); + const tableName = 'custom-table-name'; + + const existingTable = new ddb.Table(stack, 'MyTablet', { + tableName, + partitionKey: { + name: 'id', + type: ddb.AttributeType.STRING + } + }); + + const props: ApiGatewayToDynamoDBProps = { + existingTableObj: existingTable, + dynamoTableProps: { + tableName, + partitionKey: { + name: 'id', + type: ddb.AttributeType.STRING + }, + }, + }; + + const app = () => { + new ApiGatewayToDynamoDB(stack, 'test-apigateway-dynamodb-stack', props); + }; + + // Assertion + expect(app).toThrowError(/Error - Either provide existingTableObj or dynamoTableProps, but not both.\n/); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/lib/index.ts index fa753702f..33fa931ab 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/lib/index.ts @@ -82,7 +82,6 @@ export class ApiGatewayToIot extends Construct { */ constructor(scope: Construct, id: string, props: ApiGatewayToIotProps) { super(scope, id); - defaults.CheckProps(props); // Assignment to local member variables to make these available to all member methods of the class. // (Split the string just in case user supplies fully qualified endpoint eg. ab123cdefghij4l-ats.iot.ap-south-1.amazonaws.com) diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/test.apigateway-iot.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/test.apigateway-iot.test.ts index 0ef55d50f..15fe5f509 100755 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/test.apigateway-iot.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/test.apigateway-iot.test.ts @@ -18,9 +18,6 @@ import * as api from 'aws-cdk-lib/aws-apigateway'; import * as iam from 'aws-cdk-lib/aws-iam'; import { Template } from "aws-cdk-lib/assertions"; -// -------------------------------------------------------------- -// Check for ApiGateway params -// -------------------------------------------------------------- test('Test for default Params construct props', () => { // Initial Setup const stack = new cdk.Stack(); @@ -35,9 +32,6 @@ test('Test for default Params construct props', () => { expect(construct.apiGatewayRole).not.toBeNull(); }); -// -------------------------------------------------------------- -// Check for Default IAM Role -// -------------------------------------------------------------- test('Test for default IAM Role', () => { // Initial Setup const stack = new cdk.Stack(); @@ -122,9 +116,6 @@ test('Test for default IAM Role', () => { }); }); -// -------------------------------------------------------------- -// Check for Request Validator -// -------------------------------------------------------------- test('Test for default Params request validator', () => { // Initial Setup const stack = new cdk.Stack(); @@ -140,9 +131,6 @@ test('Test for default Params request validator', () => { }); }); -// -------------------------------------------------------------- -// Check for Integ Props and Method Props -// -------------------------------------------------------------- test('Test for default Params Integ Props and Method Props', () => { // Initial Setup const stack = new cdk.Stack(); @@ -234,10 +222,6 @@ test('Test for default Params Integ Props and Method Props', () => { } }); }); - -// -------------------------------------------------------------- -// Check for valid IoT Endpoint -// -------------------------------------------------------------- test('Test for valid iot endpoint', () => { // Initial Setup const stack = new cdk.Stack(); @@ -252,9 +236,6 @@ test('Test for valid iot endpoint', () => { expect(app).toThrowError(); }); -// -------------------------------------------------------------- -// Check for binaryMediaTypes -// -------------------------------------------------------------- test('Test for Binary Media types', () => { // Stack const stack = new cdk.Stack(); @@ -272,9 +253,6 @@ test('Test for Binary Media types', () => { }); }); -// -------------------------------------------------------------- -// Check for Api Name and Desc -// -------------------------------------------------------------- test('Test for Api Name and Desc', () => { // Stack const stack = new cdk.Stack(); @@ -296,9 +274,6 @@ test('Test for Api Name and Desc', () => { }); }); -// -------------------------------------------------------------- -// Check for Overridden IAM Role -// -------------------------------------------------------------- test('Test for overridden IAM Role', () => { // Initial Setup const stack = new cdk.Stack(); @@ -407,9 +382,6 @@ test('Test for overridden IAM Role', () => { }); }); -// -------------------------------------------------------------- -// Check for Api Key Source -// -------------------------------------------------------------- test('Test for APi Key Source', () => { // Stack const stack = new cdk.Stack(); @@ -430,9 +402,6 @@ test('Test for APi Key Source', () => { }); }); -// -------------------------------------------------------------- -// Check for Api Key Creation -// -------------------------------------------------------------- test('Test for Api Key Creation', () => { // Initial Setup const stack = new cdk.Stack(); @@ -467,9 +436,6 @@ test('Test for Api Key Creation', () => { }); }); -// ----------------------------------------------------------------- -// Test deployment for ApiGateway endPointCongiurationOverride -// ----------------------------------------------------------------- test('Test for deployment ApiGateway AuthorizationType override', () => { // Stack const stack = new cdk.Stack(); @@ -491,9 +457,6 @@ test('Test for deployment ApiGateway AuthorizationType override', () => { }); }); -// ----------------------------------------------------------------- -// Test deployment for override ApiGateway AuthorizationType to NONE -// ----------------------------------------------------------------- test('Test for deployment ApiGateway AuthorizationType override', () => { // Stack const stack = new cdk.Stack(); @@ -514,9 +477,6 @@ test('Test for deployment ApiGateway AuthorizationType override', () => { }); }); -// ----------------------------------------------------------------- -// Test deployment for fully qualified iotEndpoint name -// ----------------------------------------------------------------- test('Test for handling fully qualified iotEndpoint', () => { // Stack const stack = new cdk.Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/lib/index.ts index 52f389453..767bc37c4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/lib/index.ts @@ -137,7 +137,7 @@ export class ApiGatewayToKinesisStreams extends Construct { */ constructor(scope: Construct, id: string, props: ApiGatewayToKinesisStreamsProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckKinesisStreamProps(props); // Setup the Kinesis stream this.kinesisStream = defaults.buildKinesisStream(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts index 90b5c7164..e69db897b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts @@ -13,13 +13,10 @@ // Imports import { Stack, Duration } from 'aws-cdk-lib'; -import { ApiGatewayToKinesisStreams } from '../lib'; +import { ApiGatewayToKinesisStreams, ApiGatewayToKinesisStreamsProps } from '../lib'; import * as kinesis from 'aws-cdk-lib/aws-kinesis'; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Test construct properties -// -------------------------------------------------------------- test('Test construct properties', () => { const stack = new Stack(); const pattern = new ApiGatewayToKinesisStreams(stack, 'api-gateway-kinesis', {}); @@ -32,9 +29,6 @@ test('Test construct properties', () => { expect(pattern.cloudwatchAlarms !== null); }); -// -------------------------------------------------------------- -// Test deployment w/ overwritten properties -// -------------------------------------------------------------- test('Test deployment w/ overwritten properties', () => { const stack = new Stack(); @@ -87,9 +81,6 @@ test('Test deployment w/ overwritten properties', () => { template.resourceCountIs('AWS::CloudWatch::Alarm', 2); }); -// -------------------------------------------------------------- -// Test deployment w/ existing stream without default cloudwatch alarms -// -------------------------------------------------------------- test('Test deployment w/ existing stream', () => { const stack = new Stack(); @@ -232,4 +223,18 @@ test('Construct uses custom putRecordsIntegrationResponses property', () => { ] } }); -}); \ No newline at end of file +}); + +test('Confirm that CheckKinesisStreamProps is called', () => { + const stack = new Stack(); + + const props: ApiGatewayToKinesisStreamsProps = { + existingStreamObj: new kinesis.Stream(stack, 'test', {}), + kinesisStreamProps: {} + }; + + const app = () => { + new ApiGatewayToKinesisStreams(stack, 'test-eventbridge-kinesisstreams', props); + }; + expect(app).toThrowError(); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/lib/index.ts index 0a1590321..570a4f30c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/lib/index.ts @@ -69,7 +69,6 @@ export class ApiGatewayToLambda extends Construct { */ constructor(scope: Construct, id: string, props: ApiGatewayToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckLambdaProps(props); // Setup the Lambda function diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts index 4ea4a90b3..119f25b4c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts @@ -19,9 +19,6 @@ import * as api from 'aws-cdk-lib/aws-apigateway'; import { Template } from "aws-cdk-lib/assertions"; import * as defaults from '@aws-solutions-constructs/core'; -// -------------------------------------------------------------- -// Test for error with existingLambdaObj=undefined (not supplied by user). -// -------------------------------------------------------------- test('Error on existingLambdaObj=undefined', () => { // Initial Setup const stack = new Stack(); @@ -63,9 +60,6 @@ test('Test with lambdaFunctionProps', () => { }); }); -// -------------------------------------------------------------- -// Test getter methods -// -------------------------------------------------------------- test('Test properties', () => { // Initial Setup const stack = new Stack(); @@ -85,9 +79,6 @@ test('Test properties', () => { expect(app.apiGatewayLogGroup !== null); }); -// -------------------------------------------------------------- -// Test for error with lambdaFunctionProps=undefined (not supplied by user). -// -------------------------------------------------------------- test('Error on lambdaFunctionProps=undefined', () => { // Initial Setup const stack = new Stack(); @@ -100,9 +91,6 @@ test('Error on lambdaFunctionProps=undefined', () => { expect(app).toThrowError(); }); -// ----------------------------------------------------------------- -// Test deployment for override ApiGateway AuthorizationType to NONE -// ----------------------------------------------------------------- test('Test deployment ApiGateway AuthorizationType override', () => { // Stack const stack = new Stack(); @@ -127,9 +115,6 @@ test('Test deployment ApiGateway AuthorizationType override', () => { }); }); -// ----------------------------------------------------------------- -// Test deployment for override ApiGateway cloudWatchRole = false -// ----------------------------------------------------------------- test('Test deployment ApiGateway override cloudWatchRole = false', () => { // Stack const stack = new Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/lib/index.ts index 0ff4b0628..7d2324c18 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/lib/index.ts @@ -100,7 +100,7 @@ export class ApiGatewayToSageMakerEndpoint extends Construct { */ constructor(scope: Construct, id: string, props: ApiGatewayToSageMakerEndpointProps) { super(scope, id); - defaults.CheckProps(props); + // CheckSagemakerProps is not called because this construct can't create a Sagemaker resource // Setup the API Gateway const globalRestApiResponse = defaults.GlobalRestApi(this, props.apiGatewayProps, props.logGroupProps); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/apigateway-sagemakerendpoint.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/apigateway-sagemakerendpoint.test.ts index c31b4da3b..b43069523 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/apigateway-sagemakerendpoint.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/apigateway-sagemakerendpoint.test.ts @@ -17,9 +17,6 @@ import { ApiGatewayToSageMakerEndpoint } from '../lib'; import * as iam from 'aws-cdk-lib/aws-iam'; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Test construct properties -// -------------------------------------------------------------- test('Test construct properties', () => { const stack = new Stack(); const pattern = new ApiGatewayToSageMakerEndpoint(stack, 'api-gateway-sagemakerendpoint', { @@ -34,9 +31,6 @@ test('Test construct properties', () => { expect(pattern.apiGatewayLogGroup !== null); }); -// -------------------------------------------------------------- -// Test deployment w/ overwritten properties -// -------------------------------------------------------------- test('Test deployment w/ overwritten properties', () => { const stack = new Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts index 40431218f..b97e9198d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts @@ -196,7 +196,6 @@ export class ApiGatewayToSqs extends Construct { */ constructor(scope: Construct, id: string, props: ApiGatewayToSqsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckSqsProps(props); if (this.CheckCreateRequestProps(props)) { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts index db8b3d254..6ef986a5a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/lib/index.ts @@ -104,8 +104,8 @@ export class CloudFrontToApiGatewayToLambda extends Construct { */ constructor(scope: Construct, id: string, props: CloudFrontToApiGatewayToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckLambdaProps(props); + // CheckCloudFrontProps() is called by internal aws-cloudfront-apigateway construct this.lambdaFunction = defaults.buildLambdaFunction(this, { existingLambdaObj: props.existingLambdaObj, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts index aa10fc080..0c657f914 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts @@ -202,9 +202,6 @@ test('override api gateway properties without existingLambdaObj', () => { }); }); -// -------------------------------------------------------------- -// Cloudfront logging bucket with destroy removal policy and auto delete objects -// -------------------------------------------------------------- test('Cloudfront logging bucket with destroy removal policy and auto delete objects', () => { const stack = new cdk.Stack(); @@ -243,9 +240,6 @@ test('Cloudfront logging bucket with destroy removal policy and auto delete obje }); }); -// -------------------------------------------------------------- -// Cloudfront logging bucket error providing existing log bucket and logBucketProps -// -------------------------------------------------------------- test('Cloudfront logging bucket error when providing existing log bucket and logBucketProps', () => { const stack = new cdk.Stack(); const logBucket = new s3.Bucket(stack, 'cloudfront-log-bucket', {}); @@ -296,3 +290,28 @@ test('Confirm CheckLambdaProps is being called', () => { }; expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); }); + +test("Confirm CheckCloudFrontProps is being called", () => { + const stack = new cdk.Stack(); + + expect(() => { + new CloudFrontToApiGatewayToLambda(stack, "test-cloudfront-apigateway-lambda", { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_18_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + insertHttpSecurityHeaders: true, + responseHeadersPolicyProps: { + securityHeadersBehavior: { + strictTransportSecurity: { + accessControlMaxAge: cdk.Duration.seconds(63072), + includeSubdomains: true, + override: false, + preload: true + } + } + } + }); + }).toThrowError('responseHeadersPolicyProps.securityHeadersBehavior can only be passed if httpSecurityHeaders is set to `false`.'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/lib/index.ts index 3deb82336..2114518b1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/lib/index.ts @@ -79,7 +79,7 @@ export class CloudFrontToApiGateway extends Construct { */ constructor(scope: Construct, id: string, props: CloudFrontToApiGatewayProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckCloudFrontProps(props); this.apiGateway = props.existingApiGatewayObj; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts index d7ad60d05..4d19561a9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts @@ -177,9 +177,6 @@ function createApi() { return {stack, api: regionalLambdaRestApiResponse.api}; } -// -------------------------------------------------------------- -// Cloudfront logging bucket with destroy removal policy and auto delete objects -// -------------------------------------------------------------- test('Cloudfront logging bucket with destroy removal policy and auto delete objects', () => { const {stack, api} = createApi(); @@ -209,9 +206,6 @@ test('Cloudfront logging bucket with destroy removal policy and auto delete obje }); }); -// -------------------------------------------------------------- -// Cloudfront logging bucket error providing existing log bucket and logBucketProps -// -------------------------------------------------------------- test('Cloudfront logging bucket error when providing existing log bucket and logBucketProps', () => { const {stack, api} = createApi(); @@ -275,7 +269,7 @@ test('Test the deployment with securityHeadersBehavior instead of HTTP security expect(cloudFrontToS3.cloudFrontFunction).toEqual(undefined); }); -test("throw exception if insertHttpSecurityHeaders and responseHeadersPolicyProps are provided", () => { +test("Confirm CheckCloudFrontProps is being called", () => { const {stack, api} = createApi(); expect(() => { @@ -293,5 +287,5 @@ test("throw exception if insertHttpSecurityHeaders and responseHeadersPolicyProp } } }); - }).toThrowError(); + }).toThrowError('responseHeadersPolicyProps.securityHeadersBehavior can only be passed if httpSecurityHeaders is set to `false`.'); }); diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts index 3adca9492..f8110107f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/lib/index.ts @@ -87,8 +87,8 @@ export class CloudFrontToMediaStore extends Construct { */ constructor(scope: Construct, id: string, props: CloudFrontToMediaStoreProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckMediaStoreProps(props); + defaults.CheckCloudFrontProps(props); let cloudFrontDistributionProps = props.cloudFrontDistributionProps; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts index 5903d9340..7aaddb2ef 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/cloudfront-mediastore.test.ts @@ -20,9 +20,6 @@ import { CloudFrontToMediaStore } from '../lib'; import * as cdk from "aws-cdk-lib"; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Test the default deployment pattern variables -// -------------------------------------------------------------- test('Test the default deployment pattern variables', () => { // Initial setup const stack = new Stack(); @@ -37,9 +34,6 @@ test('Test the default deployment pattern variables', () => { expect(cloudFrontToMediaStore.cloudFrontFunction).not.toEqual(undefined); }); -// -------------------------------------------------------------- -// Test the deployment without HTTP security headers -// -------------------------------------------------------------- test('Test the deployment without HTTP security headers', () => { // Initial setup const stack = new Stack(); @@ -170,7 +164,7 @@ test('Test the deployment with securityHeadersBehavior instead of HTTP security expect(cloudFrontToMediaStore.cloudFrontFunction).toEqual(undefined); }); -test("throw exception if insertHttpSecurityHeaders and responseHeadersPolicyProps are provided", () => { +test("Confirm CheckCloudFrontProps is being called", () => { const stack = new cdk.Stack(); expect(() => { @@ -187,12 +181,9 @@ test("throw exception if insertHttpSecurityHeaders and responseHeadersPolicyProp } } }); - }).toThrowError(); + }).toThrowError('responseHeadersPolicyProps.securityHeadersBehavior can only be passed if httpSecurityHeaders is set to `false`.'); }); -// -------------------------------------------------------------- -// Test the deployment with existing MediaStore container -// -------------------------------------------------------------- test('Test the deployment with existing MediaStore container', () => { // Initial setup const stack = new Stack(); @@ -325,9 +316,6 @@ test('Test the deployment with existing MediaStore container', () => { expect(cloudFrontToMediaStore.cloudFrontOriginAccessIdentity).toEqual(undefined); }); -// -------------------------------------------------------------- -// Test the deployment with the user provided MediaStore properties -// -------------------------------------------------------------- test('Test the deployment with the user provided MediaStore properties', () => { // Initial setup const stack = new Stack(); @@ -471,9 +459,6 @@ test('Test the deployment with the user provided MediaStore properties', () => { expect(cloudFrontToMediaStore.cloudFrontOriginAccessIdentity).toEqual(undefined); }); -// -------------------------------------------------------------- -// Test the deployment with the user provided CloudFront properties -// -------------------------------------------------------------- test('Test the deployment with the user provided CloudFront properties', () => { // Initial setup const stack = new Stack(); @@ -650,9 +635,6 @@ test('Test the deployment with the user provided CloudFront properties', () => { }); }); -// -------------------------------------------------------------- -// Cloudfront logging bucket with destroy removal policy and auto delete objects -// -------------------------------------------------------------- test('Cloudfront logging bucket with destroy removal policy and auto delete objects', () => { const stack = new Stack(); @@ -681,9 +663,6 @@ test('Cloudfront logging bucket with destroy removal policy and auto delete obje }); }); -// -------------------------------------------------------------- -// Cloudfront logging bucket error providing existing log bucket and logBucketProps -// -------------------------------------------------------------- test('Cloudfront logging bucket error when providing existing log bucket and logBucketProps', () => { const stack = new Stack(); const logBucket = new s3.Bucket(stack, 'cloudfront-log-bucket', {}); @@ -718,4 +697,4 @@ test('Confirm CheckMediaStoreProps is called', () => { }; expect(app).toThrowError('Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n'); -}); \ No newline at end of file +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts index 810c7b827..45776a697 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/lib/index.ts @@ -111,8 +111,8 @@ export class CloudFrontToS3 extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckS3Props(props); + defaults.CheckCloudFrontProps(props); let bucket: s3.IBucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts index 14889c679..f7c0090d0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts @@ -246,9 +246,6 @@ test('test cloudfront with custom domain names', () => { }); }); -// -------------------------------------------------------------- -// s3 bucket with bucket, loggingBucket, and auto delete objects -// -------------------------------------------------------------- test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { const stack = new cdk.Stack(); @@ -282,9 +279,6 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); }); -// -------------------------------------------------------------- -// Cloudfront logging bucket with destroy removal policy and auto delete objects -// -------------------------------------------------------------- test('Cloudfront logging bucket with destroy removal policy and auto delete objects', () => { const stack = new cdk.Stack(); @@ -316,9 +310,6 @@ test('Cloudfront logging bucket with destroy removal policy and auto delete obje }); }); -// -------------------------------------------------------------- -// Cloudfront logging bucket error providing existing log bucket and logBucketProps -// -------------------------------------------------------------- test('Cloudfront logging bucket error when providing existing log bucket and logBucketProps', () => { const stack = new cdk.Stack(); const logBucket = new s3.Bucket(stack, 'cloudfront-log-bucket', {}); @@ -338,9 +329,6 @@ test('Cloudfront logging bucket error when providing existing log bucket and log expect(app).toThrowError(); }); -// -------------------------------------------------------------- -// s3 bucket with one content bucket and no logging bucket -// -------------------------------------------------------------- test('s3 bucket with one content bucket and no logging bucket', () => { const stack = new cdk.Stack(); @@ -356,9 +344,6 @@ test('s3 bucket with one content bucket and no logging bucket', () => { expect(construct.s3LoggingBucket).toEqual(undefined); }); -// -------------------------------------------------- -// CloudFront origin path -// -------------------------------------------------- test('CloudFront origin path present when provided', () => { const stack = new cdk.Stack(); @@ -457,3 +442,23 @@ test("throw exception if insertHttpSecurityHeaders and responseHeadersPolicyProp }); }).toThrowError(); }); + +test("Confirm CheckCloudFrontProps is being called", () => { + const stack = new cdk.Stack(); + + expect(() => { + new CloudFrontToS3(stack, "test-cloudfront-apigateway", { + insertHttpSecurityHeaders: true, + responseHeadersPolicyProps: { + securityHeadersBehavior: { + strictTransportSecurity: { + accessControlMaxAge: Duration.seconds(63072), + includeSubdomains: true, + override: false, + preload: true + } + } + } + }); + }).toThrowError('responseHeadersPolicyProps.securityHeadersBehavior can only be passed if httpSecurityHeaders is set to `false`.'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts index d0822f308..47a97fec3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/lib/index.ts @@ -81,7 +81,6 @@ export class CognitoToApiGatewayToLambda extends Construct { */ constructor(scope: Construct, id: string, props: CognitoToApiGatewayToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckLambdaProps(props); // This Construct requires that the auth type be COGNITO regardless of what is specified in the props diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/lib/index.ts index d2bf5e038..ac6aa517b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/lib/index.ts @@ -24,7 +24,6 @@ import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as sqs from 'aws-cdk-lib/aws-sqs'; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate import { Construct } from 'constructs'; -import * as defaults from '@aws-solutions-constructs/core'; /** * @summary The properties for the DynamoDBStreamsToLambdaToElastciSearchAndKibana Construct @@ -140,7 +139,7 @@ export class DynamoDBStreamsToLambdaToElasticSearchAndKibana extends Construct { */ constructor(scope: Construct, id: string, props: DynamoDBStreamsToLambdaToElasticSearchAndKibanaProps) { super(scope, id); - defaults.CheckProps(props); + // CheckLambdaProps() is called by aws-lambda-elasticsearch const lambdaToElasticSearchProps: LambdaToElasticSearchAndKibanaProps = { existingLambdaObj: props.existingLambdaObj, diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/lib/index.ts index 362ccc2cf..d51bbb62e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/lib/index.ts @@ -82,7 +82,6 @@ export class DynamoDBStreamsToLambda extends Construct { */ constructor(scope: Construct, id: string, props: DynamoDBStreamsToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckLambdaProps(props); this.lambdaFunction = defaults.buildLambdaFunction(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/lib/index.ts index 00e634d20..ed747969a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/lib/index.ts @@ -108,7 +108,8 @@ export class EventbridgeToKinesisFirehoseToS3 extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); + defaults.CheckEventBridgeProps(props); + // CheckS3Props is called by internal aws-kinesisfirehose-s3 construct // Set up the Kinesis Firehose using KinesisFirehoseToS3 construct const firehoseToS3 = new KinesisFirehoseToS3(this, 'KinesisFirehoseToS3', { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts index 9d9cebb09..46340caa7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts @@ -18,9 +18,6 @@ import { Template } from 'aws-cdk-lib/assertions'; import { EventbridgeToKinesisFirehoseToS3, EventbridgeToKinesisFirehoseToS3Props } from '../lib'; import * as defaults from '@aws-solutions-constructs/core'; -// -------------------------------------------------------------- -// Test snapshot match with default parameters -// -------------------------------------------------------------- function deployNewStack(stack: cdk.Stack) { const props: EventbridgeToKinesisFirehoseToS3Props = { eventRuleProps: { @@ -31,9 +28,6 @@ function deployNewStack(stack: cdk.Stack) { return new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-kinesis-firehose-s3-default-parameters', props); } -// -------------------------------------------------------------- -// Test properties -// -------------------------------------------------------------- test('Test properties', () => { const stack = new cdk.Stack(); const construct: EventbridgeToKinesisFirehoseToS3 = deployNewStack(stack); @@ -48,9 +42,6 @@ test('Test properties', () => { expect(construct.s3LoggingBucket !== null); }); -// -------------------------------------------------------------- -// Test default server side s3 bucket encryption -// -------------------------------------------------------------- test('Test default server side s3 bucket encryption', () => { const stack = new cdk.Stack(); deployNewStack(stack); @@ -70,9 +61,6 @@ test('Test default server side s3 bucket encryption', () => { }); }); -// -------------------------------------------------------------- -// Test property override -// -------------------------------------------------------------- test('Test property override', () => { const stack = new cdk.Stack(); @@ -120,9 +108,6 @@ test('Test property override', () => { }}); }); -// -------------------------------------------------------------- -// Test bad call with existingBucket and bucketProps -// -------------------------------------------------------------- test("Test bad call with existingBucket and bucketProps", () => { // Stack const stack = new cdk.Stack(); @@ -143,7 +128,7 @@ test("Test bad call with existingBucket and bucketProps", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); }); test('check eventbus property, snapshot & eventbus exists', () => { @@ -172,7 +157,7 @@ test('check eventbus property, snapshot & eventbus exists', () => { template.resourceCountIs('AWS::Events::EventBus', 1); }); -test('check exception while passing existingEventBus & eventBusProps', () => { +test('Confirm CheckEventBridgeProps is being called', () => { const stack = new cdk.Stack(); const props: EventbridgeToKinesisFirehoseToS3Props = { @@ -186,9 +171,9 @@ test('check exception while passing existingEventBus & eventBusProps', () => { }; const app = () => { - new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-firehose', props); + new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-firehose-s3', props); }; - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'); }); test('check custom event bus resource with props when deploy:true', () => { @@ -212,9 +197,6 @@ test('check custom event bus resource with props when deploy:true', () => { }); }); -// -------------------------------------------------------------- -// s3 bucket with bucket, loggingBucket, and auto delete objects -// -------------------------------------------------------------- test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { const stack = new cdk.Stack(); @@ -248,9 +230,6 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); }); -// -------------------------------------------------------------- -// s3 bucket with one content bucket and no logging bucket -// -------------------------------------------------------------- test('s3 bucket with one content bucket and no logging bucket', () => { const stack = new cdk.Stack(); @@ -307,7 +286,7 @@ test('Confirm CheckS3Props is being called', () => { }; const app = () => { - new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-firehose', props); + new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-firehose-s3', props); }; expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); }); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/lib/index.ts index 032c40f94..3709a4a76 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/lib/index.ts @@ -78,7 +78,8 @@ export class EventbridgeToKinesisStreams extends Construct { */ constructor(scope: Construct, id: string, props: EventbridgeToKinesisStreamsProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckEventBridgeProps(props); + defaults.CheckKinesisStreamProps(props); // Set up the Kinesis Stream this.kinesisStream = defaults.buildKinesisStream(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/eventbridge-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/eventbridge-kinesisstreams.test.ts index 8ff33ec52..db67a11dc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/eventbridge-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/eventbridge-kinesisstreams.test.ts @@ -17,9 +17,6 @@ import * as kinesis from 'aws-cdk-lib/aws-kinesis'; import { Template } from "aws-cdk-lib/assertions"; import {EventbridgeToKinesisStreams, EventbridgeToKinesisStreamsProps} from '../lib'; -// -------------------------------------------------------------- -// Test snapshot match with default parameters -// -------------------------------------------------------------- function deployNewStack(stack: cdk.Stack) { const props: EventbridgeToKinesisStreamsProps = { eventRuleProps: { @@ -30,9 +27,6 @@ function deployNewStack(stack: cdk.Stack) { return new EventbridgeToKinesisStreams(stack, 'test-eventbridge-kinesis-streams-default-parameters', props); } -// -------------------------------------------------------------- -// Test properties -// -------------------------------------------------------------- test('Test properties', () => { const stack = new cdk.Stack(); const construct: EventbridgeToKinesisStreams = deployNewStack(stack); @@ -43,9 +37,6 @@ test('Test properties', () => { expect(construct.eventsRole !== null); }); -// -------------------------------------------------------------- -// Test default AWS managed encryption key property -// -------------------------------------------------------------- test('Test default AWS managed encryption key property', () => { const stack = new cdk.Stack(); deployNewStack(stack); @@ -60,9 +51,6 @@ test('Test default AWS managed encryption key property', () => { }); }); -// -------------------------------------------------------------- -// Test existing resources -// -------------------------------------------------------------- test('Test existing resources', () => { const stack = new cdk.Stack(); @@ -128,7 +116,7 @@ test('check exception while passing existingEventBus & eventBusProps', () => { const app = () => { new EventbridgeToKinesisStreams(stack, 'test-eventbridge-kinesisstreams', props); }; - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'); }); test('check custom event bus resource with props when deploy:true', () => { @@ -150,4 +138,23 @@ test('check custom event bus resource with props when deploy:true', () => { template.hasResourceProperties('AWS::Events::EventBus', { Name: `testeventbus` }); -}); \ No newline at end of file +}); + +test('Confirm that CheckKinesisStreamProps is called', () => { + const stack = new cdk.Stack(); + + const props: EventbridgeToKinesisStreamsProps = { + eventRuleProps: { + eventPattern: { + source: ['solutionsconstructs'] + } + }, + existingStreamObj: new kinesis.Stream(stack, 'test', {}), + kinesisStreamProps: {} + }; + + const app = () => { + new EventbridgeToKinesisStreams(stack, 'test-eventbridge-kinesisstreams', props); + }; + expect(app).toThrowError(); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/lib/index.ts index f9f052540..c4b12a8c5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/lib/index.ts @@ -69,8 +69,8 @@ export class EventbridgeToLambda extends Construct { */ constructor(scope: Construct, id: string, props: EventbridgeToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckLambdaProps(props); + defaults.CheckEventBridgeProps(props); this.lambdaFunction = defaults.buildLambdaFunction(this, { existingLambdaObj: props.existingLambdaObj, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts index 12fa1ab48..ecda59f25 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts @@ -217,30 +217,6 @@ test('check eventbus property, snapshot & eventbus exists', () => { template.resourceCountIs('AWS::Events::EventBus', 1); }); -test('check exception while passing existingEventBus & eventBusProps', () => { - const stack = new cdk.Stack(); - - const props: EventbridgeToLambdaProps = { - lambdaFunctionProps: { - code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_16_X, - handler: 'index.handler' - }, - eventRuleProps: { - eventPattern: { - source: ['solutionsconstructs'] - } - }, - eventBusProps: { eventBusName: 'test' }, - existingEventBusInterface: new events.EventBus(stack, `test-existing-eventbus`, { eventBusName: 'test' }) - }; - - const app = () => { - new EventbridgeToLambda(stack, 'test-eventbridge-lambda', props); - }; - expect(app).toThrowError(); -}); - test('check custom event bus resource with props when deploy:true', () => { const stack = new cdk.Stack(); @@ -295,3 +271,27 @@ test('Confirm call to CheckLambdaProps', () => { // Assertion expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); }); + +test('Confirm CheckEventBridgeProps is being called', () => { + const stack = new cdk.Stack(); + + const props: EventbridgeToLambdaProps = { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler' + }, + eventRuleProps: { + eventPattern: { + source: ['solutionsconstructs'] + } + }, + eventBusProps: { eventBusName: 'test' }, + existingEventBusInterface: new events.EventBus(stack, `test-existing-eventbus`, { eventBusName: 'test' }) + }; + + const app = () => { + new EventbridgeToLambda(stack, 'test-eventbridge-lambda', props); + }; + expect(app).toThrowError('Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts index b9781dd9d..16f117634 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts @@ -87,8 +87,8 @@ export class EventbridgeToSns extends Construct { */ constructor(scope: Construct, id: string, props: EventbridgeToSnsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckSnsProps(props); + defaults.CheckEventBridgeProps(props); let enableEncryptionParam = props.enableEncryptionWithCustomerManagedKey; if (props.enableEncryptionWithCustomerManagedKey === undefined || diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts index 76045d8e0..7d3c800f5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts @@ -234,7 +234,7 @@ test('check eventbus property, snapshot & eventbus exists', () => { template.resourceCountIs('AWS::Events::EventBus', 1); }); -test('check exception while passing existingEventBus & eventBusProps', () => { +test('Confirm CheckEventBridgeProps is being called', () => { const stack = new cdk.Stack(); const props: EventbridgeToSnsProps = { @@ -250,7 +250,7 @@ test('check exception while passing existingEventBus & eventBusProps', () => { const app = () => { new EventbridgeToSns(stack, 'test-eventbridge-sns', props); }; - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'); }); test('check custom event bus resource with props when deploy:true', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/lib/index.ts index ca236a852..835884662 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/lib/index.ts @@ -116,8 +116,8 @@ export class EventbridgeToSqs extends Construct { */ constructor(scope: Construct, id: string, props: EventbridgeToSqsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckSqsProps(props); + defaults.CheckEventBridgeProps(props); // Setup the dead letter queue, if applicable this.deadLetterQueue = defaults.buildDeadLetterQueue(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts index 260eb00b2..34836f8cc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts @@ -299,7 +299,7 @@ test('check eventbus property, snapshot & eventbus exists', () => { template.resourceCountIs('AWS::Events::EventBus', 1); }); -test('check exception while passing existingEventBus & eventBusProps', () => { +test('Confirm CheckEventBridgeProps is being called', () => { const stack = new cdk.Stack(); const props: EventbridgeToSqsProps = { @@ -315,7 +315,7 @@ test('check exception while passing existingEventBus & eventBusProps', () => { const app = () => { new EventbridgeToSqs(stack, 'test-eventbridge-sqs', props); }; - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'); }); test('check custom event bus resource with props when deploy:true', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/lib/index.ts index 01b91451b..86a4acca8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/lib/index.ts @@ -79,7 +79,7 @@ export class EventbridgeToStepfunctions extends Construct { */ constructor(scope: Construct, id: string, props: EventbridgeToStepfunctionsProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckEventBridgeProps(props); const buildStateMachineResponse = defaults.buildStateMachine(this, props.stateMachineProps, props.logGroupProps); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts index 6c6eb9c2c..0138bde2b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts @@ -150,7 +150,7 @@ test('check eventbus property, snapshot & eventbus exists', () => { template.resourceCountIs('AWS::Events::EventBus', 1); }); -test('check exception while passing existingEventBus & eventBusProps', () => { +test('Confirm CheckEventBridgeProps is being called', () => { const stack = new cdk.Stack(); const startState = new sfn.Pass(stack, 'StartState'); @@ -170,7 +170,7 @@ test('check exception while passing existingEventBus & eventBusProps', () => { const app = () => { new EventbridgeToStepfunctions(stack, 'test-eventbridge-stepfunctions', props); }; - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'); }); test('check custom event bus resource with props when deploy:true', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts index e6d4ec2cd..60ef5c9c4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/lib/index.ts @@ -140,7 +140,6 @@ export class FargateToDynamoDB extends Construct { constructor(scope: Construct, id: string, props: FargateToDynamoDBProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckDynamoDBProps(props); defaults.CheckVpcProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts index ebace3548..498b58249 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/lib/index.ts @@ -132,9 +132,9 @@ export class FargateToEventbridge extends Construct { constructor(scope: Construct, id: string, props: FargateToEventbridgeProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckVpcProps(props); + defaults.CheckEventBridgeProps(props); this.vpc = defaults.buildVpc(scope, { existingVpc: props.existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts index 0a8e7f10e..e8789f9d4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/fargate-eventbridge.test.ts @@ -398,3 +398,23 @@ test('Confirm that CheckVpcProps was called', () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm CheckEventBridgeProps is being called', () => { + const stack = new cdk.Stack(); + + const props: FargateToEventbridgeProps = { + publicApi: true, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + eventBusProps: { eventBusName: 'test' }, + existingEventBusInterface: new events.EventBus(stack, `test-existing-eventbus`, { eventBusName: 'test' }) + }; + + const app = () => { + new FargateToEventbridge(stack, 'test-fargate-eventbridge', props); + }; + expect(app).toThrowError('Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts index c17170209..c1df8bea4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/lib/index.ts @@ -125,7 +125,6 @@ export class FargateToKinesisFirehose extends Construct { constructor(scope: Construct, id: string, props: FargateToKinesisFirehoseProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckVpcProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts index 57b95b6e8..a71abdc57 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/lib/index.ts @@ -150,9 +150,9 @@ export class FargateToKinesisStreams extends Construct { */ constructor(scope: Construct, id: string, props: FargateToKinesisStreamsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckVpcProps(props); + defaults.CheckKinesisStreamProps(props); // Setup the VPC this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts index 15740bc9d..5ae9df5b6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/fargate-kinesisstreams.test.ts @@ -623,3 +623,30 @@ test('Confirm that CheckVpcProps was called', () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm that CheckKinesisStreamsProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + const clusterName = "custom-cluster-name"; + const containerName = "custom-container-name"; + const serviceName = "custom-service-name"; + const familyName = "custom-family-name"; + + const props: FargateToKinesisStreamsProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + vpcProps: { }, + existingStreamObj: new kinesis.Stream(stack, 'test', {}), + kinesisStreamProps: {} + }; + + const app = () => { + new FargateToKinesisStreams(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts index 33d8abfdc..439c81380 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/lib/index.ts @@ -145,9 +145,9 @@ export class FargateToOpenSearch extends Construct { constructor(scope: Construct, id: string, props: FargateToOpenSearchProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckVpcProps(props); + defaults.CheckOpenSearchProps(props); this.vpc = defaults.buildVpc(scope, { existingVpc: props.existingVpc, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts index a102ffc5e..c12f81c9c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts @@ -720,7 +720,7 @@ test('Existing service/new domain, private API, existing VPC', () => { template.resourceCountIs('AWS::OpenSearchService::Domain', 1); }); -test('Check error for using OpenSearch VPC prop parameter', () => { +test('Confirm CheckOpenSearchProps is called', () => { const stack = new cdk.Stack(); const publicApi = false; diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts index 02b520da2..d04dbf50d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/lib/index.ts @@ -161,7 +161,6 @@ export class FargateToS3 extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckS3Props(props); defaults.CheckVpcProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts index 721ba5a97..4c03f206e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/lib/index.ts @@ -134,9 +134,9 @@ export class FargateToSecretsmanager extends Construct { constructor(scope: Construct, id: string, props: FargateToSecretsmanagerProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckVpcProps(props); + defaults.CheckSecretsManagerProps(props); // Other permissions for constructs are accepted as arrays, turning grantWriteAccess into // an array to use the same validation function. diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts index ac84bf248..4b5daa9f7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts @@ -16,6 +16,7 @@ import * as defaults from '@aws-solutions-constructs/core'; import * as cdk from "aws-cdk-lib"; import { FargateToSecretsmanager, FargateToSecretsmanagerProps } from "../lib"; import * as ecs from 'aws-cdk-lib/aws-ecs'; +import * as secrets from 'aws-cdk-lib/aws-secretsmanager'; import { buildSecretsManagerSecret } from '@aws-solutions-constructs/core'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; @@ -663,3 +664,28 @@ test('Confirm that CheckVpcProps was called', () => { // Assertion expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); + +test('Confirm that CheckSecretsManagerProps was called', () => { + const stack = new cdk.Stack(); + const publicApi = true; + + const props: FargateToSecretsmanagerProps = { + publicApi, + ecrRepositoryArn: defaults.fakeEcrRepoArn, + clusterProps: { clusterName }, + containerDefinitionProps: { containerName }, + fargateTaskDefinitionProps: { family: familyName }, + fargateServiceProps: { serviceName }, + secretProps: { + secretName + }, + existingSecretObj: new secrets.Secret(stack, 'test', {}), + vpcProps: { }, + }; + + const app = () => { + new FargateToSecretsmanager(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide secretProps or existingSecretObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts index a694daada..ccae9849c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/lib/index.ts @@ -153,7 +153,6 @@ export class FargateToSns extends Construct { constructor(scope: Construct, id: string, props: FargateToSnsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckSnsProps(props); defaults.CheckVpcProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts index de07fe47a..992b91b97 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/lib/index.ts @@ -178,7 +178,6 @@ export class FargateToSqs extends Construct { constructor(scope: Construct, id: string, props: FargateToSqsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckSqsProps(props); defaults.CheckVpcProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts index 533be3cea..39a1fe36e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/lib/index.ts @@ -133,7 +133,6 @@ export class FargateToSsmstringparameter extends Construct { constructor(scope: Construct, id: string, props: FargateToSsmstringparameterProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckVpcProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts index 64d238471..cbe37a755 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/lib/index.ts @@ -138,7 +138,6 @@ export class FargateToStepfunctions extends Construct { constructor(scope: Construct, id: string, props: FargateToStepfunctionsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckFargateProps(props); defaults.CheckVpcProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/lib/index.ts index 97431270c..27e288be1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/lib/index.ts @@ -19,7 +19,6 @@ import * as logs from 'aws-cdk-lib/aws-logs'; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate import { Construct } from 'constructs'; import * as defaults from '@aws-solutions-constructs/core'; -import { overrideProps } from '@aws-solutions-constructs/core'; import { KinesisFirehoseToS3 } from '@aws-solutions-constructs/aws-kinesisfirehose-s3'; /** @@ -96,8 +95,6 @@ export class IotToKinesisFirehoseToS3 extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); - const firehoseToS3 = new KinesisFirehoseToS3(this, 'KinesisFirehoseToS3', { kinesisFirehoseProps: props.kinesisFirehoseProps, existingBucketObj: props.existingBucketObj, @@ -134,7 +131,7 @@ export class IotToKinesisFirehoseToS3 extends Construct { roleArn: this.iotActionsRole.roleArn } }]); - const iotTopicProps = overrideProps(defaultIotTopicProps, props.iotTopicRuleProps, true); + const iotTopicProps = defaults.overrideProps(defaultIotTopicProps, props.iotTopicRuleProps, true); // Create the IoT topic rule this.iotTopicRule = new iot.CfnTopicRule(this, 'IotTopic', iotTopicProps); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts index a77015ea2..e74600402 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts @@ -111,8 +111,10 @@ test('check firehose and s3 overrides', () => { IntervalInSeconds: 600, SizeInMBs: 55 } - }}); + } + }); }); + test('check properties', () => { const stack = new cdk.Stack(); @@ -127,9 +129,6 @@ test('check properties', () => { expect(construct.s3LoggingBucket !== null); }); -// -------------------------------------------------------------- -// Test bad call with existingBucket and bucketProps -// -------------------------------------------------------------- test("Confirm CheckS3Props is being called", () => { // Stack const stack = new cdk.Stack(); @@ -157,9 +156,6 @@ test("Confirm CheckS3Props is being called", () => { expect(app).toThrowError("Error - Either provide bucketProps or existingBucketObj, but not both.\n"); }); -// -------------------------------------------------------------- -// s3 bucket with bucket, loggingBucket, and auto delete objects -// -------------------------------------------------------------- test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { const stack = new cdk.Stack(); @@ -197,9 +193,6 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); }); -// -------------------------------------------------------------- -// Test bad call with logS3AccessLogs as false and bucketProps -// -------------------------------------------------------------- test("Test bad call with logS3AccessLogs as false and bucketProps", () => { // Stack const stack = new cdk.Stack(); @@ -225,9 +218,6 @@ test("Test bad call with logS3AccessLogs as false and bucketProps", () => { expect(app).toThrowError('Error - If logS3AccessLogs is false, supplying loggingBucketProps or existingLoggingBucketObj is invalid.\n'); }); -// -------------------------------------------------------------- -// s3 bucket with one content bucket and no logging bucket -// -------------------------------------------------------------- test('s3 bucket with one content bucket and no logging bucket', () => { const stack = new cdk.Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/lib/index.ts index ffb17e44e..6c27d29fd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/lib/index.ts @@ -65,7 +65,7 @@ export class IotToKinesisStreams extends Construct { */ constructor(scope: Construct, id: string, props: IotToKinesisStreamsProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckKinesisStreamProps(props); // Set up the Kinesis Stream this.kinesisStream = defaults.buildKinesisStream(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/test.iot-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/test.iot-kinesisstreams.test.ts index 2d295da58..daecaa05b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/test.iot-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/test.iot-kinesisstreams.test.ts @@ -241,7 +241,7 @@ test('check construct chaining', () => { template.resourceCountIs('AWS::Kinesis::Stream', 1); }); -test('check error when stream props and existing stream is supplied', () => { +test('Confirm call to CheckKinesisStreamProps', () => { const stack = new cdk.Stack(); const existingKinesisStream = new kinesis.Stream(stack, `existing-stream`, {}); @@ -254,5 +254,5 @@ test('check error when stream props and existing stream is supplied', () => { const app = () => { new IotToKinesisStreams(stack, 'test-iot-kinesisstreams', props); }; - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'); }); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/lib/index.ts index 1a9715d69..d35dbe0fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/lib/index.ts @@ -94,8 +94,6 @@ export class IotToLambdaToDynamoDB extends Construct { */ constructor(scope: Construct, id: string, props: IotToLambdaToDynamoDBProps) { super(scope, id); - defaults.CheckProps(props); - defaults.CheckSnsProps(props); // Other permissions for constructs are accepted as arrays, turning tablePermissions into // an array to use the same validation function. diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts index e69a46d51..e571342db 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/iot-lambda-dynamodb.test.ts @@ -366,9 +366,6 @@ test('check lambda function custom environment variable', () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC without vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC without vpcProps", () => { // Stack const stack = new cdk.Stack(); @@ -425,9 +422,6 @@ test("Test minimal deployment that deploys a VPC without vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment that deploys a VPC w/vpcProps -// -------------------------------------------------------------- test("Test minimal deployment that deploys a VPC w/vpcProps", () => { // Stack const stack = new cdk.Stack(); @@ -490,9 +484,6 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC", () => { // Stack const stack = new cdk.Stack(); @@ -544,16 +535,12 @@ test("Test minimal deployment with an existing VPC", () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC and existing Lambda function not in a VPC -// -// buildLambdaFunction should throw an error if the Lambda function is not -// attached to a VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC and existing Lambda function not in a VPC", () => { // Stack const stack = new cdk.Stack(); + // buildLambdaFunction should throw an error if the Lambda function is not + // attached to a VPC const testLambdaFunction = new lambda.Function(stack, 'test-lambda', { runtime: lambda.Runtime.NODEJS_16_X, handler: "index.handler", @@ -584,9 +571,6 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }); -// -------------------------------------------------------------- -// Test bad call with existingVpc and deployVpc -// -------------------------------------------------------------- test("Confirm CheckVpcProps is called", () => { // Stack const stack = new cdk.Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/lib/index.ts index ad0dc64d3..42b2b727d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/lib/index.ts @@ -57,7 +57,6 @@ export class IotToLambda extends Construct { */ constructor(scope: Construct, id: string, props: IotToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckLambdaProps(props); this.lambdaFunction = defaults.buildLambdaFunction(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts index d17c4e809..232e67009 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/lib/index.ts @@ -82,7 +82,6 @@ export class IotToS3 extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckS3Props(props); // Setup S3 Bucket diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/lib/index.ts index c6ed87fdc..e75e16eb9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/lib/index.ts @@ -102,7 +102,6 @@ export class IotToSqs extends Construct { */ constructor(scope: Construct, id: string, props: IotToSqsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckSqsProps(props); // Setup the dead letter queue, if applicable diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/iot-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/iot-sqs.test.ts index bc84424c7..201465b17 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/iot-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/iot-sqs.test.ts @@ -19,9 +19,6 @@ import * as sqs from 'aws-cdk-lib/aws-sqs'; import * as kms from 'aws-cdk-lib/aws-kms'; import * as defaults from '@aws-solutions-constructs/core'; -// -------------------------------------------------------------- -// Pattern deployment with default props -// -------------------------------------------------------------- test('Pattern deployment with default props', () => { // Initial Setup const stack = new Stack(); @@ -81,9 +78,6 @@ test('Pattern deployment with default props', () => { }); }); -// -------------------------------------------------------------- -// Testing with existing SQS Queue -// -------------------------------------------------------------- test('Pattern deployment with existing queue', () => { // Initial Setup const stack = new Stack(); @@ -112,9 +106,6 @@ test('Pattern deployment with existing queue', () => { }); }); -// -------------------------------------------------------------- -// Testing with passing queue and dead letter queue props -// -------------------------------------------------------------- test('Pattern deployment with queue and dead letter queue props', () => { // Initial Setup const stack = new Stack(); @@ -158,9 +149,6 @@ test('Pattern deployment with queue and dead letter queue props', () => { }); }); -// -------------------------------------------------------------- -// Testing with dead letter queue turned off -// -------------------------------------------------------------- test('Pattern deployment with dead letter queue turned off', () => { // Initial Setup const stack = new Stack(); @@ -193,9 +181,6 @@ test('Pattern deployment with dead letter queue turned off', () => { }); }); -// -------------------------------------------------------------- -// Testing with custom maxReceiveCount -// -------------------------------------------------------------- test('Pattern deployment with custom maxReceiveCount', () => { // Initial Setup const stack = new Stack(); @@ -236,9 +221,6 @@ test('Pattern deployment with custom maxReceiveCount', () => { }); }); -// -------------------------------------------------------------- -// Testing without creating a KMS key -// -------------------------------------------------------------- test('Pattern deployment without creating a KMS key', () => { // Initial Setup const stack = new Stack(); @@ -293,9 +275,6 @@ test('Pattern deployment without creating a KMS key', () => { template.resourceCountIs("AWS::KMS::Key", 0); }); -// -------------------------------------------------------------- -// Testing with existing KMS key -// -------------------------------------------------------------- test('Pattern deployment with existing KMS key', () => { // Initial Setup const stack = new Stack(); @@ -362,9 +341,6 @@ test('Pattern deployment with existing KMS key', () => { }); }); -// --------------------------------------------------------------- -// Testing with existing KMS key on queueProps.encryptionMasterKey -// --------------------------------------------------------------- test('Pattern deployment with existing KMS key', () => { // Initial Setup const stack = new Stack(); @@ -433,9 +409,6 @@ test('Pattern deployment with existing KMS key', () => { }); }); -// -------------------------------------------------------------- -// Testing with passing KMS key props -// -------------------------------------------------------------- test('Pattern deployment passing KMS key props', () => { // Initial Setup const stack = new Stack(); @@ -510,9 +483,6 @@ test('Pattern deployment passing KMS key props', () => { }); }); -// -------------------------------------------------------------- -// Testing with passing a FIFO queue (not supported by IoT) -// -------------------------------------------------------------- test('Pattern deployment with passing a FIFO queue (not supported by IoT)', () => { // Initial Setup const stack = new Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts index 8798c43e8..7c144a724 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts @@ -98,8 +98,6 @@ export class KinesisFirehoseToAnalyticsAndS3 extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); - // Setup the kinesisfirehose-s3 pattern const kinesisFirehoseToS3Props: KinesisFirehoseToS3Props = { kinesisFirehoseProps: props.kinesisFirehoseProps, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts index ec1c2b1de..0fb36c413 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/lib/index.ts @@ -94,7 +94,6 @@ export class KinesisFirehoseToS3 extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckS3Props(props); const firehoseId = 'KinesisFirehose'; diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts index 1671ab5fa..f1eb0b435 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/kinesisfirehose-s3.test.ts @@ -213,9 +213,6 @@ test("Confirm that CheckS3Props is being called", () => { expect(app).toThrowError("Error - Either provide bucketProps or existingBucketObj, but not both.\n"); }); -// -------------------------------------------------------------- -// s3 bucket with bucket, loggingBucket, and auto delete objects -// -------------------------------------------------------------- test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { const stack = new cdk.Stack(); @@ -248,9 +245,6 @@ test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { }); }); -// -------------------------------------------------------------- -// Test bad call with existingLoggingBucketObj and loggingBucketProps -// -------------------------------------------------------------- test("Test bad call with existingLoggingBucketObj and loggingBucketProps", () => { // Stack const stack = new cdk.Stack(); @@ -270,9 +264,6 @@ test("Test bad call with existingLoggingBucketObj and loggingBucketProps", () => expect(app).toThrowError('Error - Either provide existingLoggingBucketObj or loggingBucketProps, but not both.\n'); }); -// -------------------------------------------------------------- -// Test bad call with logS3AccessLogs as false and bucketProps -// -------------------------------------------------------------- test("Test bad call with logS3AccessLogs as false and bucketProps", () => { // Stack const stack = new cdk.Stack(); @@ -290,9 +281,6 @@ test("Test bad call with logS3AccessLogs as false and bucketProps", () => { expect(app).toThrowError('Error - If logS3AccessLogs is false, supplying loggingBucketProps or existingLoggingBucketObj is invalid.\n'); }); -// -------------------------------------------------------------- -// s3 bucket with one content bucket and no logging bucket -// -------------------------------------------------------------- test('s3 bucket with one content bucket and no logging bucket', () => { const stack = new cdk.Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts index 5568a5937..29cfeaf23 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/lib/index.ts @@ -173,8 +173,8 @@ export class KinesisstreamsToGluejob extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckGlueProps(props); + defaults.CheckKinesisStreamProps(props); this.kinesisStream = defaults.buildKinesisStream(this, { existingStreamObj: props.existingStreamObj, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts index a4a0d75a6..5e0f4a5f4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/kinesisstream-gluejob.test.ts @@ -880,3 +880,42 @@ test('Check properties when output bucket is provided', () => { expect(construct.outputBucket![0]).toBeDefined(); expect(construct.outputBucket![1]).not.toBeDefined(); }); + +test('Confirm call to CheckKinesisStreamProps', () => { + // Initial Setup + const stack = new Stack(); + + const props: KinesisstreamsToGluejobProps = { + glueJobProps: { + command: { + name: 'glueetl', + pythonVersion: '3', + scriptLocation: 's3://fakebucket/fakefolder/fakefolder/fakefile.py' + } + }, + fieldSchema: [{ + name: "id", + type: "int", + comment: "Identifier for the record" + }, { + name: "name", + type: "string", + comment: "The name of the record" + }, { + name: "type", + type: "string", + comment: "The type of the record" + }, { + name: "numericvalue", + type: "int", + comment: "Some value associated with the record" + }], + existingStreamObj: new Stream(stack, 'test', {}), + kinesisStreamProps: {} + }; + const app = () => { + new KinesisstreamsToGluejob(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts index 9eb56020c..21ce087da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/lib/index.ts @@ -117,7 +117,8 @@ export class KinesisStreamsToKinesisFirehoseToS3 extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); + defaults.CheckKinesisStreamProps(props); + // CheckS3Props() is called by the internal aws-kinesisfirehose-s3 construct // Setup the Kinesis Stream this.kinesisStream = defaults.buildKinesisStream(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts index 0d435e207..ecd7174ca 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/kinesisstreams-kinesisfirehose-s3.test.ts @@ -17,6 +17,7 @@ import { Template } from 'aws-cdk-lib/assertions'; import * as defaults from '@aws-solutions-constructs/core'; import { Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam'; import * as s3 from 'aws-cdk-lib/aws-s3'; +import * as kinesis from 'aws-cdk-lib/aws-kinesis'; function deploy(stack: cdk.Stack, props: KinesisStreamsToKinesisFirehoseToS3Props = {}) { return new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-stream-firehose-s3', props); @@ -257,3 +258,18 @@ test("Confirm that CheckS3Props is being called", () => { // Assertion expect(app).toThrowError("Error - Either provide bucketProps or existingBucketObj, but not both.\n"); }); + +test('Confirm call to CheckKinesisStreamProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + + const props: KinesisStreamsToKinesisFirehoseToS3Props = { + existingStreamObj: new kinesis.Stream(stack, 'test', {}), + kinesisStreamProps: {} + }; + const app = () => { + new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/lib/index.ts index ecf0e4b7f..e0f68b198 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/lib/index.ts @@ -94,8 +94,8 @@ export class KinesisStreamsToLambda extends Construct { */ constructor(scope: Construct, id: string, props: KinesisStreamsToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckLambdaProps(props); + defaults.CheckKinesisStreamProps(props); // Setup the Kinesis Stream this.kinesisStream = defaults.buildKinesisStream(this, { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts index 9935241d0..16d4ac1d9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts @@ -138,3 +138,23 @@ test('Confirm call to CheckLambdaProps', () => { // Assertion expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); }); + +test('Confirm call to CheckKinesisStreamProps', () => { + // Initial Setup + const stack = new Stack(); + + const props: KinesisStreamsToLambdaProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingStreamObj: new kinesis.Stream(stack, 'test', {}), + kinesisStreamProps: {} + }; + const app = () => { + new KinesisStreamsToLambda(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts index 6f3be85a1..2379fdd58 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts @@ -90,7 +90,6 @@ export class LambdaToDynamoDB extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToDynamoDBProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckDynamoDBProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts index 2ef1a3813..1d8397080 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/lib/index.ts @@ -92,7 +92,6 @@ export class LambdaToElasticachememcached extends Construct { props: LambdaToElasticachememcachedProps ) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts index 7f4254c96..742ea3498 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/lib/index.ts @@ -107,7 +107,6 @@ export class LambdaToElasticSearchAndKibana extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToElasticSearchAndKibanaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts index 03eb1b584..8a0fbaaa3 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/lib/index.ts @@ -86,9 +86,9 @@ export class LambdaToEventbridge extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToEventbridgeProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); + defaults.CheckEventBridgeProps(props); if (props.deployVpc || props.existingVpc) { this.vpc = defaults.buildVpc(scope, { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts index 246b86b0a..ca46ce863 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts @@ -140,7 +140,7 @@ test("Confirm CheckVpcProps is being called", () => { expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); }); -test("Test bad call with existingVpc and deployVpc", () => { +test("Confirm CheckEventBridgeProps is called", () => { // Stack const stack = new Stack(); @@ -157,12 +157,9 @@ test("Test bad call with existingVpc and deployVpc", () => { }); }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'); }); -// -------------------------------------------------------------- -// Test deployment w/ existing eventbus -// -------------------------------------------------------------- test('Test deployment w/ existing eventbus', () => { // Stack const stack = new Stack(); @@ -268,9 +265,6 @@ test("Test minimal deployment that deploys a VPC w/vpcProps", () => { template.resourceCountIs("AWS::EC2::InternetGateway", 0); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC", () => { // Stack const stack = new Stack(); @@ -335,10 +329,6 @@ test("Test minimal deployment with an existing VPC", () => { }); }); -// -------------------------------------------------------------- -// Test minimal deployment with an existing VPC and existing Lambda function not in a VPC -// -// -------------------------------------------------------------- test("Test minimal deployment with an existing VPC and existing Lambda function not in a VPC", () => { // Stack const stack = new Stack(); @@ -362,7 +352,7 @@ test("Test minimal deployment with an existing VPC and existing Lambda function }; // Assertion - expect(app).toThrowError(); + expect(app).toThrowError('A Lambda function must be bound to a VPC upon creation, it cannot be added to a VPC in a subsequent construct'); }); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts index 1f988aa1f..bdccc5944 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/lib/index.ts @@ -104,7 +104,6 @@ export class LambdaToKendra extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToKendraProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts index d4562a033..e5a4677e4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/lib/index.ts @@ -82,7 +82,6 @@ export class LambdaToKinesisFirehose extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToKinesisFirehoseProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts index 895734136..f7451f252 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/lib/index.ts @@ -95,9 +95,9 @@ export class LambdaToKinesisStreams extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToKinesisStreamsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); + defaults.CheckKinesisStreamProps(props); // Setup the VPC if (props.deployVpc || props.existingVpc) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts index 7396c8628..05fd96014 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/lambda-kinesisstream.test.ts @@ -601,3 +601,23 @@ test('Confirm call to CheckLambdaProps', () => { // Assertion expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); }); + +test('Confirm call to CheckKinesisStreamProps', () => { + // Initial Setup + const stack = new cdk.Stack(); + + const props: LambdaToKinesisStreamsProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + existingStreamObj: new kinesis.Stream(stack, 'test', {}), + kinesisStreamProps: {} + }; + const app = () => { + new LambdaToKinesisStreams(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts index 212bf4f45..ca1228cd7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/lib/index.ts @@ -107,9 +107,9 @@ export class LambdaToOpenSearch extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToOpenSearchProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); + defaults.CheckOpenSearchProps(props); if (props.vpcProps && !props.deployVpc) { throw new Error("Error - deployVpc must be true when defining vpcProps"); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts index 2533b776a..1c75c121b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/lambda-opensearch.test.ts @@ -567,7 +567,7 @@ test('Test error for Lambda function VPC props', () => { expect(app).toThrowError("Error - Define VPC using construct parameters not Lambda function props"); }); -test('Test error for the OpenSearch domain VPC props', () => { +test('Confirm CheckOpenSearchProps is called', () => { const stack = new cdk.Stack(); const app = () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts index fb223ca81..8985f7ed8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/lib/index.ts @@ -114,7 +114,6 @@ export class LambdaToS3 extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckS3Props(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts index 3b27984e9..e5233aaa0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/lib/index.ts @@ -105,7 +105,6 @@ export class LambdaToSagemakerEndpoint extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToSagemakerEndpointProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); defaults.CheckSagemakerProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts index 4819539af..966f04f1b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/lib/index.ts @@ -92,9 +92,9 @@ export class LambdaToSecretsmanager extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToSecretsmanagerProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); + defaults.CheckSecretsManagerProps(props); if (props.deployVpc || props.existingVpc) { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts index 4c752bd7d..ec7ff2c75 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts @@ -14,7 +14,7 @@ // Imports import { RemovalPolicy, Stack } from "aws-cdk-lib"; import * as lambda from "aws-cdk-lib/aws-lambda"; -import { Secret } from 'aws-cdk-lib/aws-secretsmanager'; +import * as secrets from 'aws-cdk-lib/aws-secretsmanager'; import * as ec2 from "aws-cdk-lib/aws-ec2"; import { LambdaToSecretsmanager, LambdaToSecretsmanagerProps } from '../lib'; import { Template } from 'aws-cdk-lib/assertions'; @@ -44,7 +44,7 @@ test('Test deployment w/ existing secret', () => { // Stack const stack = new Stack(); // Helper declaration - const existingSecret = new Secret(stack, 'secret', {}); + const existingSecret = new secrets.Secret(stack, 'secret', {}); const pattern = new LambdaToSecretsmanager(stack, 'lambda-to-secretsmanager-stack', { lambdaFunctionProps: { runtime: lambda.Runtime.NODEJS_16_X, @@ -419,3 +419,25 @@ test('Confirm call to CheckLambdaProps', () => { // Assertion expect(app).toThrowError('Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'); }); + +test('Confirm call to CheckSecretsManagerProps', () => { + // Initial Setup + const stack = new Stack(); + + const props: LambdaToSecretsmanagerProps = { + lambdaFunctionProps: { + runtime: lambda.Runtime.NODEJS_16_X, + handler: 'index.handler', + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + }, + secretProps: { + secretName: 'test' + }, + existingSecretObj: new secrets.Secret(stack, 'test', {}), + }; + const app = () => { + new LambdaToSecretsmanager(stack, 'test-construct', props); + }; + // Assertion + expect(app).toThrowError('Error - Either provide secretProps or existingSecretObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts index 0f0612790..7996f9638 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/lib/index.ts @@ -113,7 +113,6 @@ export class LambdaToSns extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToSnsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckSnsProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/lib/index.ts index 13eda1f42..b14523652 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/lib/index.ts @@ -20,7 +20,6 @@ import { SqsToLambda } from '@aws-solutions-constructs/aws-sqs-lambda'; import { Construct } from 'constructs'; import { SqsEventSourceProps } from 'aws-cdk-lib/aws-lambda-event-sources'; import * as ec2 from "aws-cdk-lib/aws-ec2"; -import * as defaults from '@aws-solutions-constructs/core'; /** * @summary The properties for the LambdaToSqsToLambda class. @@ -131,7 +130,6 @@ export class LambdaToSqsToLambda extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToSqsToLambdaProps) { super(scope, id); - defaults.CheckProps(props); // Setup the aws-lambda-sqs pattern const lambdaToSqs = new LambdaToSqs(this, 'lambda-to-sqs', { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts index 7f8710fcc..5fa88501e 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/lib/index.ts @@ -131,7 +131,6 @@ export class LambdaToSqs extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToSqsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckSqsProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts index 0ae04d0b5..ef7d0279e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/lib/index.ts @@ -94,7 +94,6 @@ export class LambdaToSsmstringparameter extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToSsmstringparameterProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts index e592e85d9..ab1cd7da8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/lib/index.ts @@ -97,7 +97,6 @@ export class LambdaToStepfunctions extends Construct { */ constructor(scope: Construct, id: string, props: LambdaToStepfunctionsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckVpcProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts index 6f4bb3489..2130e99b2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/lib/index.ts @@ -103,8 +103,6 @@ export class Route53ToAlb extends Construct { */ constructor(scope: Construct, id: string, props: Route53ToAlbProps) { super(scope, id); - defaults.CheckProps(props); - // NOTE: We don't call CheckAlbProps() here, because this construct creates an ALB // with no listener or target, so some of those checks don't apply this.PropsCustomCheck(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts index d973cd623..1c18e8284 100755 --- a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/lib/index.ts @@ -84,7 +84,6 @@ export class Route53ToApiGateway extends Construct { */ constructor(scope: Construct, id: string, props: Route53ToApiGatewayProps) { super(scope, id); - defaults.CheckProps(props); this.certificate = props.existingCertificateInterface; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts index 74b2296f5..b334bcccd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/lib/index.ts @@ -89,7 +89,6 @@ export class S3ToLambda extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckS3Props(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts index 0df5c0718..5c522a454 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/lib/index.ts @@ -129,7 +129,6 @@ export class S3ToSns extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckSnsProps(props); defaults.CheckS3Props(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts index 8a69d3e1e..cebd96705 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/lib/index.ts @@ -139,7 +139,6 @@ export class S3ToSqs extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckSqsProps(props); defaults.CheckS3Props(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts index 496dea659..83fac8004 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/lib/index.ts @@ -106,7 +106,6 @@ export class S3ToStepfunctions extends Construct { // context here rather than assuming the client will set it this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - defaults.CheckProps(props); defaults.CheckS3Props(props); let bucket: s3.IBucket; diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts index d1c959d83..f419afeed 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/lib/index.ts @@ -85,7 +85,6 @@ export class SnsToLambda extends Construct { */ constructor(scope: Construct, id: string, props: SnsToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckSnsProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts index e298db4c2..155ae4bf7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/lib/index.ts @@ -115,7 +115,6 @@ export class SnsToSqs extends Construct { */ constructor(scope: Construct, id: string, props: SnsToSqsProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckSnsProps(props); defaults.CheckSqsProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts index f07c49626..880b82c6a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/lib/index.ts @@ -111,7 +111,6 @@ export class SqsToLambda extends Construct { */ constructor(scope: Construct, id: string, props: SqsToLambdaProps) { super(scope, id); - defaults.CheckProps(props); defaults.CheckSqsProps(props); defaults.CheckLambdaProps(props); diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts index b6cee9a87..ca3c4ae00 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/lib/index.ts @@ -53,7 +53,7 @@ export class WafwebaclToAlb extends Construct { */ constructor(scope: Construct, id: string, props: WafwebaclToAlbProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckWafWebAclProps(props); // CheckAlbProps() not called because this only accepts and existing Load Balancer // Build the Web ACL diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/test.wafwebacl-alb.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/test.wafwebacl-alb.test.ts index a8941e2ae..be7a1dadc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/test.wafwebacl-alb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/test.wafwebacl-alb.test.ts @@ -38,10 +38,7 @@ function deployConstruct(stack: cdk.Stack, webaclProps?: waf.CfnWebACLProps, exi }); } -// -------------------------------------------------------------- -// Test error handling for existing WAF web ACL and user provided web ACL props -// -------------------------------------------------------------- -test('Test error handling for existing WAF web ACL and user provider web ACL props', () => { +test('Confirm CheckWafWebAclProps is called', () => { const stack = new cdk.Stack(); const props: waf.CfnWebACLProps = { defaultAction: { @@ -64,7 +61,7 @@ test('Test error handling for existing WAF web ACL and user provider web ACL pro existingWebaclObj: wafAcl, webaclProps: props }); - }).toThrowError(); + }).toThrowError('Error - Either provide existingWebaclObj or webaclProps, but not both.\n'); }); // -------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts index fd7f4dae5..c7d3130ed 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/lib/index.ts @@ -54,7 +54,7 @@ export class WafwebaclToApiGateway extends Construct { */ constructor(scope: Construct, id: string, props: WafwebaclToApiGatewayProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckWafWebAclProps(props); // Build the Web ACL this.webacl = defaults.buildWebacl(this, 'REGIONAL', { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts index cc6da5575..c1941167e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts @@ -30,7 +30,7 @@ function deployConstruct(stack: cdk.Stack, constructProps?: waf.CfnWebACLProps | return new WafwebaclToApiGateway(stack, 'test-wafwebacl-apigateway', props); } -test('Test error handling for existing WAF web ACL and user provider web ACL props', () => { +test('Confirm CheckWafWebAclProps is called', () => { const stack = new cdk.Stack(); const props: waf.CfnWebACLProps = { defaultAction: { @@ -53,7 +53,7 @@ test('Test error handling for existing WAF web ACL and user provider web ACL pro existingWebaclObj: wafAcl, webaclProps: props }); - }).toThrowError(); + }).toThrowError('Error - Either provide existingWebaclObj or webaclProps, but not both.\n'); }); test('Test default deployment', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts index 2215207ff..2fe981b31 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/lib/index.ts @@ -53,7 +53,7 @@ export class WafwebaclToAppsync extends Construct { */ constructor(scope: Construct, id: string, props: WafwebaclToAppsyncProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckWafWebAclProps(props); // Build the Web ACL this.webacl = defaults.buildWebacl(this, "REGIONAL", { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts index 6b13384b6..bc5826048 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts @@ -40,10 +40,7 @@ function deployConstruct( }); } -// -------------------------------------------------------------- -// Test error handling for existing WAF web ACL and user provided web ACL props -// -------------------------------------------------------------- -test("Test error handling for existing WAF web ACL and user provider web ACL props", () => { +test('Confirm CheckWafWebAclProps is called', () => { const stack = new cdk.Stack(); const props: waf.CfnWebACLProps = { defaultAction: { @@ -66,7 +63,7 @@ test("Test error handling for existing WAF web ACL and user provider web ACL pro existingWebaclObj: wafAcl, webaclProps: props, }); - }).toThrowError(); + }).toThrowError('Error - Either provide existingWebaclObj or webaclProps, but not both.\n'); }); // -------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/lib/index.ts index 757996dd5..457d481a7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/lib/index.ts @@ -57,7 +57,7 @@ export class WafwebaclToCloudFront extends Construct { */ constructor(scope: Construct, id: string, props: WafwebaclToCloudFrontProps) { super(scope, id); - defaults.CheckProps(props); + defaults.CheckWafWebAclProps(props); // Build the Web ACL this.webacl = defaults.buildWebacl(this, 'CLOUDFRONT', { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts index 77461d1d4..974c8ad18 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts @@ -37,7 +37,7 @@ function deployConstruct(stack: cdk.Stack, constructProps?: waf.CfnWebACLProps | return new WafwebaclToCloudFront(stack, 'test-wafwebacl-cloudfront', props); } -test('Test error handling for existing WAF web ACL and user provider web ACL props', () => { +test('Confirm CheckWafWebAclProps is called', () => { const stack = new cdk.Stack(); const props: waf.CfnWebACLProps = { defaultAction: { @@ -63,7 +63,7 @@ test('Test error handling for existing WAF web ACL and user provider web ACL pro existingWebaclObj: wafAcl, webaclProps: props }); - }).toThrowError(); + }).toThrowError('Error - Either provide existingWebaclObj or webaclProps, but not both.\n'); }); test('Test default deployment', () => { diff --git a/source/patterns/@aws-solutions-constructs/core/index.ts b/source/patterns/@aws-solutions-constructs/core/index.ts index c35ed2b18..29bc3741f 100644 --- a/source/patterns/@aws-solutions-constructs/core/index.ts +++ b/source/patterns/@aws-solutions-constructs/core/index.ts @@ -64,7 +64,6 @@ export * from './lib/glue-table-defaults'; export * from './lib/glue-table-helper'; export * from './lib/glue-database-defaults'; export * from './lib/glue-database-helper'; -export * from './lib/input-validation'; export * from './test/test-helper'; export * from './lib/ssm-string-parameter-helper'; export * from './lib/eventbridge-helper'; diff --git a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts index 0bbff36fe..19f7eec07 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/cloudfront-distribution-helper.ts @@ -264,3 +264,22 @@ function getLoggingBucket( function getCloudfrontFunction(httpSecurityHeaders: boolean, scope: Construct) { return httpSecurityHeaders ? defaultCloudfrontFunction(scope) : undefined; } + +export interface CloudFrontProps { + readonly insertHttpSecurityHeaders?: boolean; + readonly responseHeadersPolicyProps?: cloudfront.ResponseHeadersPolicyProps; +} + +export function CheckCloudFrontProps(propsObject: CloudFrontProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.insertHttpSecurityHeaders !== false && propsObject.responseHeadersPolicyProps?.securityHeadersBehavior) { + errorMessages += 'responseHeadersPolicyProps.securityHeadersBehavior can only be passed if httpSecurityHeaders is set to `false`.'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/dynamodb-table-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/dynamodb-table-helper.ts index 9d28b59b4..cf2cfe68b 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/dynamodb-table-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/dynamodb-table-helper.ts @@ -70,7 +70,6 @@ export interface BuildDynamoDBTableResponse { * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. */ export function buildDynamoDBTable(scope: Construct, props: BuildDynamoDBTableProps): BuildDynamoDBTableResponse { - checkTableProps(props); // Conditional DynamoDB Table creation if (props.existingTableObj) { @@ -84,33 +83,6 @@ export function buildDynamoDBTable(scope: Construct, props: BuildDynamoDBTablePr } } -/** - * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. - */ -export function checkTableProps(props: BuildDynamoDBTableProps) { - let errorMessages = ''; - let errorFound = false; - - if (props.dynamoTableProps && props.existingTableObj) { - errorMessages += 'Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'; - errorFound = true; - } - - if (props.dynamoTableProps && props.existingTableInterface) { - errorMessages += 'Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'; - errorFound = true; - } - - if (props.existingTableObj && props.existingTableInterface) { - errorMessages += 'Error - Either provide existingTableInterface or existingTableObj, but not both.\n'; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - export interface BuildDynamoDBTableWithStreamResponse { readonly tableInterface: dynamodb.ITable, readonly tableObject?: dynamodb.Table, @@ -143,3 +115,33 @@ export function getPartitionKeyNameFromTable(table: dynamodb.Table): string { } return partitionKey.attributeName; } + +export interface DynamoDBProps { + readonly dynamoTableProps?: dynamodb.TableProps, + readonly existingTableObj?: dynamodb.Table, + readonly existingTableInterface?: dynamodb.ITable, +} + +export function CheckDynamoDBProps(propsObject: DynamoDBProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.dynamoTableProps && propsObject.existingTableObj) { + errorMessages += 'Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'; + errorFound = true; + } + + if (propsObject.dynamoTableProps && propsObject.existingTableInterface) { + errorMessages += 'Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'; + errorFound = true; + } + + if (propsObject.existingTableObj && propsObject.existingTableInterface) { + errorMessages += 'Error - Either provide existingTableInterface or existingTableObj, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/eventbridge-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/eventbridge-helper.ts index 469ca514f..819ec3bfd 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/eventbridge-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/eventbridge-helper.ts @@ -49,4 +49,23 @@ export function buildEventBus(scope: Construct, props: BuildEventBusProps): even } // ESLint requires this return statement, so disabling SonarQube warning return; // NOSONAR -} \ No newline at end of file +} + +export interface EventBridgeProps { + readonly existingEventBusInterface: events.IEventBus, + readonly eventBusProps: events.EventBusProps +} + +export function CheckEventBridgeProps(propsObject: EventBridgeProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingEventBusInterface && propsObject.eventBusProps) { + errorMessages += 'Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/glue-table-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/glue-table-helper.ts index 077dd3768..4939a26be 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/glue-table-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/glue-table-helper.ts @@ -18,6 +18,8 @@ import { CfnTable, CfnTableProps } from "aws-cdk-lib/aws-glue"; import { Construct } from "constructs"; +import * as glue from 'aws-cdk-lib/aws-glue'; +import * as s3assets from 'aws-cdk-lib/aws-s3-assets'; /** * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. @@ -34,3 +36,47 @@ import { Construct } from "constructs"; export function DefaultGlueTable(scope: Construct, tableProps: CfnTableProps): CfnTable { return new CfnTable(scope, 'GlueTable', tableProps); } +export interface GlueProps { + readonly existingGlueJob?: glue.CfnJob, + readonly etlCodeAsset?: s3assets.Asset; + readonly glueJobProps?: glue.CfnJobProps | any; + readonly fieldSchema?: glue.CfnTable.ColumnProperty[]; + readonly existingTable?: glue.CfnTable; + readonly tablePropss?: glue.CfnTableProps; +} + +export function CheckGlueProps(propsObject: GlueProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.glueJobProps && propsObject.existingGlueJob) { + errorMessages += 'Error - Either provide glueJobProps or existingGlueJob, but not both.\n'; + errorFound = true; + } + + if ((!propsObject.existingGlueJob) && (!propsObject.glueJobProps.command.scriptLocation && !propsObject.etlCodeAsset)) { + errorMessages += ('Either one of CfnJob.JobCommandProperty.scriptLocation or etlCodeAsset has ' + + 'to be provided. If the ETL Job code file exists in a local filesystem, please set ' + + 'KinesisstreamsToGluejobProps.etlCodeAsset. If the ETL Job is available in an S3 bucket, set the ' + + 'CfnJob.JobCommandProperty.scriptLocation property\n'); + errorFound = true; + } + + if (propsObject.glueJobProps?.command?.scriptLocation) { + const s3Url: string = propsObject.glueJobProps.command.scriptLocation; + const found = s3Url.match(/^s3:\/\/\S+\/\S+/g); + if (!(found && found.length > 0 && found[0].length === s3Url.length)) { + errorMessages += "Invalid S3 URL for Glue script provided\n"; + errorFound = true; + } + } + + if (propsObject.fieldSchema === undefined && propsObject.existingTable === undefined && propsObject.tableProps === undefined) { + errorMessages += "Either fieldSchema or table property has to be set, both cannot be omitted"; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts b/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts deleted file mode 100644 index 654d73ef1..000000000 --- a/source/patterns/@aws-solutions-constructs/core/lib/input-validation.ts +++ /dev/null @@ -1,375 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -/* - * The functions found here in the core library are for internal use and can be changed - * or removed outside of a major release. We recommend against calling them directly from client code. - */ - -import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; -import * as kinesis from 'aws-cdk-lib/aws-kinesis'; -import * as lambda from 'aws-cdk-lib/aws-lambda'; -import * as sqs from 'aws-cdk-lib/aws-sqs'; -import * as mediastore from 'aws-cdk-lib/aws-mediastore'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as sns from 'aws-cdk-lib/aws-sns'; -import * as glue from 'aws-cdk-lib/aws-glue'; -import * as sagemaker from 'aws-cdk-lib/aws-sagemaker'; -import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager"; -import * as kms from "aws-cdk-lib/aws-kms"; -import { ResponseHeadersPolicyProps } from "aws-cdk-lib/aws-cloudfront"; -import * as opensearch from "aws-cdk-lib/aws-opensearchservice"; -import * as s3assets from "aws-cdk-lib/aws-s3-assets"; - -export interface VerifiedProps { - readonly existingStreamObj?: kinesis.Stream; - readonly kinesisStreamProps?: kinesis.StreamProps, - - readonly existingSecretObj?: secretsmanager.Secret; - readonly secretProps?: secretsmanager.SecretProps; - - readonly encryptionKey?: kms.Key, - readonly encryptionKeyProps?: kms.KeyProps - - readonly insertHttpSecurityHeaders?: boolean; - readonly responseHeadersPolicyProps?: ResponseHeadersPolicyProps; - readonly openSearchDomainProps?: opensearch.CfnDomainProps; - -} - -/** - * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. - */ -export function CheckProps(propsObject: VerifiedProps | any) { - let errorMessages = ''; - let errorFound = false; - - if (propsObject.existingStreamObj && propsObject.kinesisStreamProps) { - errorMessages += 'Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'; - errorFound = true; - } - - if (propsObject.existingSecretObj && propsObject.secretProps) { - errorMessages += 'Error - Either provide secretProps or existingSecretObj, but not both.\n'; - errorFound = true; - } - - if (propsObject.encryptionKey && propsObject.encryptionKeyProps) { - errorMessages += 'Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'; - errorFound = true; - } - - if (propsObject.existingEventBusInterface && propsObject.eventBusProps) { - errorMessages += 'Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'; - errorFound = true; - } - - if (propsObject.existingWebaclObj && propsObject.webaclProps) { - errorMessages += 'Error - Either provide existingWebaclObj or webaclProps, but not both.\n'; - errorFound = true; - } - - if (propsObject.insertHttpSecurityHeaders !== false && propsObject.responseHeadersPolicyProps?.securityHeadersBehavior) { - errorMessages += 'responseHeadersPolicyProps.securityHeadersBehavior can only be passed if httpSecurityHeaders is set to `false`.'; - errorFound = true; - } - - if (propsObject.openSearchDomainProps?.vpcOptions) { - errorMessages += "Error - Define VPC using construct parameters not the OpenSearch Service props\n"; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -export interface GlueProps { - readonly existingGlueJob?: glue.CfnJob, - readonly etlCodeAsset?: s3assets.Asset; - readonly glueJobProps?: glue.CfnJobProps | any; - readonly fieldSchema?: glue.CfnTable.ColumnProperty[]; - readonly existingTable?: glue.CfnTable; - readonly tablePropss?: glue.CfnTableProps; -} - -export function CheckGlueProps(propsObject: GlueProps | any) { - let errorMessages = ''; - let errorFound = false; - - if (propsObject.glueJobProps && propsObject.existingGlueJob) { - errorMessages += 'Error - Either provide glueJobProps or existingGlueJob, but not both.\n'; - errorFound = true; - } - - if ((!propsObject.existingGlueJob) && (!propsObject.glueJobProps.command.scriptLocation && !propsObject.etlCodeAsset)) { - errorMessages += ('Either one of CfnJob.JobCommandProperty.scriptLocation or etlCodeAsset has ' + - 'to be provided. If the ETL Job code file exists in a local filesystem, please set ' + - 'KinesisstreamsToGluejobProps.etlCodeAsset. If the ETL Job is available in an S3 bucket, set the ' + - 'CfnJob.JobCommandProperty.scriptLocation property\n'); - errorFound = true; - } - - if (propsObject.glueJobProps?.command?.scriptLocation) { - const s3Url: string = propsObject.glueJobProps.command.scriptLocation; - const found = s3Url.match(/^s3:\/\/\S+\/\S+/g); - if (!(found && found.length > 0 && found[0].length === s3Url.length)) { - errorMessages += "Invalid S3 URL for Glue script provided\n"; - errorFound = true; - } - } - - if (propsObject.fieldSchema === undefined && propsObject.existingTable === undefined && propsObject.tableProps === undefined) { - errorMessages += "Either fieldSchema or table property has to be set, both cannot be omitted"; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -export interface DynamoDBProps { - readonly dynamoTableProps?: dynamodb.TableProps, - readonly existingTableObj?: dynamodb.Table, - readonly existingTableInterface?: dynamodb.ITable, -} - -export function CheckDynamoDBProps(propsObject: DynamoDBProps | any) { - let errorMessages = ''; - let errorFound = false; - - if (propsObject.dynamoTableProps && propsObject.existingTableObj) { - errorMessages += 'Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'; - errorFound = true; - } - - if (propsObject.dynamoTableProps && propsObject.existingTableInterface) { - errorMessages += 'Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -export interface SnsProps { - readonly topicProps?: sns.TopicProps, - readonly existingTopicObj?: sns.Topic, - readonly existingTopicObject?: sns.Topic, - readonly encryptionKey?: kms.Key, - readonly encryptionKeyProps?: kms.KeyProps -} - -export function CheckSnsProps(propsObject: SnsProps | any) { - let errorMessages = ''; - let errorFound = false; - - // FargateToSns used TopicObject instead of TopicObj - to fix would be a breaking change, so we - // must look for both here. - if (propsObject.topicProps && (propsObject.existingTopicObj || propsObject.existingTopicObject)) { - errorMessages += 'Error - Either provide topicProps or existingTopicObj, but not both.\n'; - errorFound = true; - } - - if (propsObject.topicProps?.masterKey && propsObject.encryptionKey) { - errorMessages += 'Error - Either provide topicProps.masterKey or encryptionKey, but not both.\n'; - errorFound = true; - } - - if (propsObject.topicProps?.masterKey && propsObject.encryptionKeyProps) { - errorMessages += 'Error - Either provide topicProps.masterKey or encryptionKeyProps, but not both.\n'; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -export interface SqsProps { - readonly existingQueueObj?: sqs.Queue, - readonly queueProps?: sqs.QueueProps, - readonly deployDeadLetterQueue?: boolean, - readonly deadLetterQueueProps?: sqs.QueueProps, - readonly encryptionKey?: kms.Key, - readonly encryptionKeyProps?: kms.KeyProps -} - -export function CheckSqsProps(propsObject: SqsProps | any) { - let errorMessages = ''; - let errorFound = false; - - if (propsObject.existingQueueObj && propsObject.queueProps) { - errorMessages += 'Error - Either provide queueProps or existingQueueObj, but not both.\n'; - errorFound = true; - } - - if (propsObject.queueProps?.encryptionMasterKey && propsObject.encryptionKey) { - errorMessages += 'Error - Either provide queueProps.encryptionMasterKey or encryptionKey, but not both.\n'; - errorFound = true; - } - - if (propsObject.queueProps?.encryptionMasterKey && propsObject.encryptionKeyProps) { - errorMessages += 'Error - Either provide queueProps.encryptionMasterKey or encryptionKeyProps, but not both.\n'; - errorFound = true; - } - - if ((propsObject?.deployDeadLetterQueue === false) && propsObject.deadLetterQueueProps) { - errorMessages += 'Error - If deployDeadLetterQueue is false then deadLetterQueueProps cannot be specified.\n'; - errorFound = true; - } - - const isQueueFifo: boolean = propsObject?.queueProps?.fifo; - const isDeadLetterQueueFifo: boolean = propsObject?.deadLetterQueueProps?.fifo; - const deployDeadLetterQueue: boolean = propsObject.deployDeadLetterQueue || propsObject.deployDeadLetterQueue === undefined; - - if (deployDeadLetterQueue && (isQueueFifo !== isDeadLetterQueueFifo)) { - errorMessages += 'Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + - 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -export interface S3Props { - readonly existingBucketObj?: s3.Bucket, - readonly existingBucketInterface?: s3.IBucket, - readonly bucketProps?: s3.BucketProps, - readonly existingLoggingBucketObj?: s3.IBucket; - readonly loggingBucketProps?: s3.BucketProps; - readonly logS3AccessLogs?: boolean; -} - -export function CheckS3Props(propsObject: S3Props | any) { - let errorMessages = ''; - let errorFound = false; - - if ((propsObject.existingBucketObj || propsObject.existingBucketInterface) && propsObject.bucketProps) { - errorMessages += 'Error - Either provide bucketProps or existingBucketObj, but not both.\n'; - errorFound = true; - } - - if (propsObject.existingLoggingBucketObj && propsObject.loggingBucketProps) { - errorMessages += 'Error - Either provide existingLoggingBucketObj or loggingBucketProps, but not both.\n'; - errorFound = true; - } - - if ((propsObject?.logS3AccessLogs === false) && (propsObject.loggingBucketProps || propsObject.existingLoggingBucketObj)) { - errorMessages += 'Error - If logS3AccessLogs is false, supplying loggingBucketProps or existingLoggingBucketObj is invalid.\n'; - errorFound = true; - } - - if (propsObject.existingBucketObj && (propsObject.loggingBucketProps || propsObject.logS3AccessLogs)) { - errorMessages += 'Error - If existingBucketObj is provided, supplying loggingBucketProps or logS3AccessLogs is an error.\n'; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -export interface VpcPropsSet { - readonly existingVpc?: ec2.IVpc; - readonly vpcProps?: ec2.VpcProps; - readonly deployVpc?: boolean; - -} - -export function CheckVpcProps(propsObject: VpcPropsSet | any) { - let errorMessages = ''; - let errorFound = false; - - if ((propsObject.deployVpc || propsObject.vpcProps) && propsObject.existingVpc) { - errorMessages += 'Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -export interface LambdaProps { - readonly existingLambdaObj?: lambda.Function, - readonly lambdaFunctionProps?: lambda.FunctionProps, -} - -export function CheckLambdaProps(propsObject: LambdaProps | any) { - let errorMessages = ''; - let errorFound = false; - - if (propsObject.existingLambdaObj && propsObject.lambdaFunctionProps) { - errorMessages += 'Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -export interface MediaStoreProps { - readonly existingMediaStoreContainerObj?: mediastore.CfnContainer; - readonly mediaStoreContainerProps?: mediastore.CfnContainerProps; -} - -export function CheckMediaStoreProps(propsObject: MediaStoreProps | any) { - let errorMessages = ''; - let errorFound = false; - - if (propsObject.existingMediaStoreContainerObj && propsObject.mediaStoreContainerProps) { - errorMessages += 'Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n'; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -export interface SagemakerProps { - readonly existingSagemakerEndpointObj?: sagemaker.CfnEndpoint, - readonly endpointProps?: sagemaker.CfnEndpointProps, -} - -export function CheckSagemakerProps(propsObject: SagemakerProps | any) { - let errorMessages = ''; - let errorFound = false; - - if (propsObject.existingSagemakerEndpointObj && propsObject.endpointProps) { - errorMessages += 'Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'; - errorFound = true; - } - - if (errorFound) { - throw new Error(errorMessages); - } -} - -/** - * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. - */ -export function CheckListValues(allowedPermissions: string[], submittedValues: string[], valueType: string) { - submittedValues.forEach((submittedValue) => { - if (!allowedPermissions.includes(submittedValue)) { - throw Error(`Invalid ${valueType} submitted - ${submittedValue}`); - } - }); -} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/kinesis-streams-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/kinesis-streams-helper.ts index f366dafc8..050fbd956 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/kinesis-streams-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/kinesis-streams-helper.ts @@ -95,4 +95,23 @@ export function buildKinesisStreamCWAlarms(scope: Construct): cloudwatch.Alarm[] })); return alarms; -} \ No newline at end of file +} + +export interface KinesisStreamProps { + readonly existingStreamObj?: kinesis.Stream; + readonly kinesisStreamProps?: kinesis.StreamProps, +} + +export function CheckKinesisStreamProps(propsObject: KinesisStreamProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingStreamObj && propsObject.kinesisStreamProps) { + errorMessages += 'Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts index ebcb5c859..0a0989c4e 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/lambda-helper.ts @@ -237,3 +237,22 @@ export function getLambdaVpcSecurityGroupIds(lambdaFunction: lambda.Function): s return securityGroupIds; } + +export interface LambdaProps { + readonly existingLambdaObj?: lambda.Function, + readonly lambdaFunctionProps?: lambda.FunctionProps, +} + +export function CheckLambdaProps(propsObject: LambdaProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingLambdaObj && propsObject.lambdaFunctionProps) { + errorMessages += 'Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/mediastore-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/mediastore-helper.ts index b8428283c..4ce2f08d8 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/mediastore-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/mediastore-helper.ts @@ -39,4 +39,23 @@ export function MediaStoreContainer(scope: Construct, mediaStoreContainerProps?: mediaStoreContainer.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.RETAIN; return mediaStoreContainer; -} \ No newline at end of file +} + +export interface MediaStoreProps { + readonly existingMediaStoreContainerObj?: mediastore.CfnContainer; + readonly mediaStoreContainerProps?: mediastore.CfnContainerProps; +} + +export function CheckMediaStoreProps(propsObject: MediaStoreProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingMediaStoreContainerObj && propsObject.mediaStoreContainerProps) { + errorMessages += 'Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/opensearch-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/opensearch-helper.ts index 7393177e3..6aa3124e2 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/opensearch-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/opensearch-helper.ts @@ -305,3 +305,21 @@ function createDashboardCognitoRole( cognitoDashboardConfigureRolePolicy.attachToRole(cognitoDashboardConfigureRole); return cognitoDashboardConfigureRole; } + +export interface OpenSearchProps { + readonly openSearchDomainProps?: opensearch.CfnDomainProps; +} + +export function CheckOpenSearchProps(propsObject: OpenSearchProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.openSearchDomainProps?.vpcOptions) { + errorMessages += "Error - Define VPC using construct parameters not the OpenSearch Service props\n"; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts index 799ebe876..adcf285f6 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/s3-bucket-helper.ts @@ -238,3 +238,41 @@ export function addCfnNagS3BucketNotificationRulesToSuppress(stackRoot: cdk.Stac } ]); } + +export interface S3Props { + readonly existingBucketObj?: s3.Bucket, + readonly existingBucketInterface?: s3.IBucket, + readonly bucketProps?: s3.BucketProps, + readonly existingLoggingBucketObj?: s3.IBucket; + readonly loggingBucketProps?: s3.BucketProps; + readonly logS3AccessLogs?: boolean; +} + +export function CheckS3Props(propsObject: S3Props | any) { + let errorMessages = ''; + let errorFound = false; + + if ((propsObject.existingBucketObj || propsObject.existingBucketInterface) && propsObject.bucketProps) { + errorMessages += 'Error - Either provide bucketProps or existingBucketObj, but not both.\n'; + errorFound = true; + } + + if (propsObject.existingLoggingBucketObj && propsObject.loggingBucketProps) { + errorMessages += 'Error - Either provide existingLoggingBucketObj or loggingBucketProps, but not both.\n'; + errorFound = true; + } + + if ((propsObject?.logS3AccessLogs === false) && (propsObject.loggingBucketProps || propsObject.existingLoggingBucketObj)) { + errorMessages += 'Error - If logS3AccessLogs is false, supplying loggingBucketProps or existingLoggingBucketObj is invalid.\n'; + errorFound = true; + } + + if (propsObject.existingBucketObj && (propsObject.loggingBucketProps || propsObject.logS3AccessLogs)) { + errorMessages += 'Error - If existingBucketObj is provided, supplying loggingBucketProps or logS3AccessLogs is an error.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts index e835260fd..24e3b84d4 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sagemaker-helper.ts @@ -550,3 +550,22 @@ export function createSagemakerEndpoint( return endpoint; } + +export interface SagemakerProps { + readonly existingSagemakerEndpointObj?: sagemaker.CfnEndpoint, + readonly endpointProps?: sagemaker.CfnEndpointProps, +} + +export function CheckSagemakerProps(propsObject: SagemakerProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingSagemakerEndpointObj && propsObject.endpointProps) { + errorMessages += 'Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/secretsmanager-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/secretsmanager-helper.ts index 095c96271..84c0c0d20 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/secretsmanager-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/secretsmanager-helper.ts @@ -16,7 +16,7 @@ * or removed outside of a major release. We recommend against calling them directly from client code. */ -import { Secret, SecretProps } from 'aws-cdk-lib/aws-secretsmanager'; +import * as secrets from 'aws-cdk-lib/aws-secretsmanager'; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate import { Construct } from 'constructs'; import { DefaultSecretProps } from './secretsmanager-defaults'; @@ -31,10 +31,10 @@ import { consolidateProps, addCfnSuppressRules } from './utils'; * @param id * @param secretProps */ -export function buildSecretsManagerSecret(scope: Construct, id: string, secretProps?: SecretProps): Secret { - let secret: Secret; +export function buildSecretsManagerSecret(scope: Construct, id: string, secretProps?: secrets.SecretProps): secrets.Secret { + let secret: secrets.Secret; - secret = new Secret(scope, id, consolidateProps(DefaultSecretProps, secretProps)); + secret = new secrets.Secret(scope, id, consolidateProps(DefaultSecretProps, secretProps)); // suppress warning on build addCfnSuppressRules(secret, [ @@ -46,3 +46,22 @@ export function buildSecretsManagerSecret(scope: Construct, id: string, secretPr return secret; } + +export interface SecretsManagerProps { + readonly existingSecretObj?: secrets.Secret; + readonly secretProps?: secrets.SecretProps; +} + +export function CheckSecretsManagerProps(propsObject: SecretsManagerProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingSecretObj && propsObject.secretProps) { + errorMessages += 'Error - Either provide secretProps or existingSecretObj, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sns-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sns-helper.ts index 883a82b92..b82075a24 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sns-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sns-helper.ts @@ -172,3 +172,42 @@ export function buildTopic(scope: Construct, props: BuildTopicProps): BuildTopic return { topic: props.existingTopicObj, key: props.existingTopicEncryptionKey }; } } + +export interface SnsProps { + readonly topicProps?: sns.TopicProps, + readonly existingTopicObj?: sns.Topic, + readonly existingTopicObject?: sns.Topic, + readonly encryptionKey?: kms.Key, + readonly encryptionKeyProps?: kms.KeyProps +} + +export function CheckSnsProps(propsObject: SnsProps | any) { + let errorMessages = ''; + let errorFound = false; + + // FargateToSns used TopicObject instead of TopicObj - to fix would be a breaking change, so we + // must look for both here. + if (propsObject.topicProps && (propsObject.existingTopicObj || propsObject.existingTopicObject)) { + errorMessages += 'Error - Either provide topicProps or existingTopicObj, but not both.\n'; + errorFound = true; + } + + if (propsObject.topicProps?.masterKey && propsObject.encryptionKey) { + errorMessages += 'Error - Either provide topicProps.masterKey or encryptionKey, but not both.\n'; + errorFound = true; + } + + if (propsObject.topicProps?.masterKey && propsObject.encryptionKeyProps) { + errorMessages += 'Error - Either provide topicProps.masterKey or encryptionKeyProps, but not both.\n'; + errorFound = true; + } + + if (propsObject.encryptionKey && propsObject.encryptionKeyProps) { + errorMessages += 'Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts index 0d93060ee..4328319a7 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/sqs-helper.ts @@ -227,4 +227,57 @@ function applySecureQueuePolicy(queue: sqs.Queue): void { } }) ); -} \ No newline at end of file +} + +export interface SqsProps { + readonly existingQueueObj?: sqs.Queue, + readonly queueProps?: sqs.QueueProps, + readonly deployDeadLetterQueue?: boolean, + readonly deadLetterQueueProps?: sqs.QueueProps, + readonly encryptionKey?: kms.Key, + readonly encryptionKeyProps?: kms.KeyProps +} + +export function CheckSqsProps(propsObject: SqsProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingQueueObj && propsObject.queueProps) { + errorMessages += 'Error - Either provide queueProps or existingQueueObj, but not both.\n'; + errorFound = true; + } + + if (propsObject.queueProps?.encryptionMasterKey && propsObject.encryptionKey) { + errorMessages += 'Error - Either provide queueProps.encryptionMasterKey or encryptionKey, but not both.\n'; + errorFound = true; + } + + if (propsObject.queueProps?.encryptionMasterKey && propsObject.encryptionKeyProps) { + errorMessages += 'Error - Either provide queueProps.encryptionMasterKey or encryptionKeyProps, but not both.\n'; + errorFound = true; + } + + if (propsObject.encryptionKey && propsObject.encryptionKeyProps) { + errorMessages += 'Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'; + errorFound = true; + } + + if ((propsObject?.deployDeadLetterQueue === false) && propsObject.deadLetterQueueProps) { + errorMessages += 'Error - If deployDeadLetterQueue is false then deadLetterQueueProps cannot be specified.\n'; + errorFound = true; + } + + const isQueueFifo: boolean = propsObject?.queueProps?.fifo; + const isDeadLetterQueueFifo: boolean = propsObject?.deadLetterQueueProps?.fifo; + const deployDeadLetterQueue: boolean = propsObject.deployDeadLetterQueue || propsObject.deployDeadLetterQueue === undefined; + + if (deployDeadLetterQueue && (isQueueFifo !== isDeadLetterQueueFifo)) { + errorMessages += 'Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/utils.ts b/source/patterns/@aws-solutions-constructs/core/lib/utils.ts index 324bf91ac..5a0e065cd 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/utils.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/utils.ts @@ -256,3 +256,14 @@ export function generateName(scope: Construct, resourceId: string = ""): string } return name; } + +/** + * @internal This is an internal core function and should not be called directly by Solutions Constructs clients. + */ +export function CheckListValues(allowedPermissions: string[], submittedValues: string[], valueType: string) { + submittedValues.forEach((submittedValue) => { + if (!allowedPermissions.includes(submittedValue)) { + throw Error(`Invalid ${valueType} submitted - ${submittedValue}`); + } + }); +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts index 6ca739ca4..f880b9356 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/vpc-helper.ts @@ -270,4 +270,24 @@ export function retrievePrivateSubnetIds(vpc: ec2.IVpc) { }; return vpc.selectSubnets(subnetSelector).subnetIds; -} \ No newline at end of file +} + +export interface VpcPropsSet { + readonly existingVpc?: ec2.IVpc; + readonly vpcProps?: ec2.VpcProps; + readonly deployVpc?: boolean; +} + +export function CheckVpcProps(propsObject: VpcPropsSet | any) { + let errorMessages = ''; + let errorFound = false; + + if ((propsObject.deployVpc || propsObject.vpcProps) && propsObject.existingVpc) { + errorMessages += 'Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} diff --git a/source/patterns/@aws-solutions-constructs/core/lib/waf-helper.ts b/source/patterns/@aws-solutions-constructs/core/lib/waf-helper.ts index 3f4b51c97..67a03a9ea 100644 --- a/source/patterns/@aws-solutions-constructs/core/lib/waf-helper.ts +++ b/source/patterns/@aws-solutions-constructs/core/lib/waf-helper.ts @@ -50,3 +50,22 @@ export function buildWebacl(scope: Construct, webaclScope: string, props: BuildW return webAcl; } + +export interface WafWebAclProps { + readonly existingWebaclObj: waf.CfnWebACL, + readonly webaclProps: waf.CfnWebACLProps, +} + +export function CheckWafWebAclProps(propsObject: WafWebAclProps | any) { + let errorMessages = ''; + let errorFound = false; + + if (propsObject.existingWebaclObj && propsObject.webaclProps) { + errorMessages += 'Error - Either provide existingWebaclObj or webaclProps, but not both.\n'; + errorFound = true; + } + + if (errorFound) { + throw new Error(errorMessages); + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts index 047d61509..71bf22f6f 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts @@ -21,6 +21,7 @@ import { Bucket } from 'aws-cdk-lib/aws-s3'; import * as origins from 'aws-cdk-lib/aws-cloudfront-origins'; import { LambdaEdgeEventType } from 'aws-cdk-lib/aws-cloudfront'; import * as acm from 'aws-cdk-lib/aws-certificatemanager'; +import * as defaults from '../'; test('check bucket policy metadata', () => { const stack = new Stack(); @@ -539,3 +540,23 @@ test('test cloudfront override cloudfront custom domain names ', () => { } }); }); + +// --------------------------- +// Prop Tests +// --------------------------- +test('Test CloudFront insertHttpHeaders bad props', () => { + + const props: defaults.CloudFrontProps = { + insertHttpSecurityHeaders: true, + responseHeadersPolicyProps: { + securityHeadersBehavior: {} + } + }; + + const app = () => { + defaults.CheckCloudFrontProps(props); + }; + + // Assertion + expect(app).toThrowError('responseHeadersPolicyProps.securityHeadersBehavior can only be passed if httpSecurityHeaders is set to `false`.'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/dynamo-table.test.ts b/source/patterns/@aws-solutions-constructs/core/test/dynamo-table.test.ts index 70c50ee08..c995e14b7 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/dynamo-table.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/dynamo-table.test.ts @@ -421,74 +421,37 @@ test('test getPartitionKeyNameFromTable()', () => { expect(testKeyName).toEqual(partitionKeyName); }); -test('Test providing both existingTableInterface and existingTableObj', () => { +// --------------------------- +// Prop Tests +// --------------------------- +test('Test fail DynamoDB table check', () => { const stack = new Stack(); - const tableProps: dynamodb.TableProps = { - partitionKey: { - name: 'table_id', - type: dynamodb.AttributeType.STRING - }, - stream: dynamodb.StreamViewType.NEW_IMAGE + const props: defaults.DynamoDBProps = { + existingTableObj: new dynamodb.Table(stack, 'placeholder', defaults.DefaultTableProps), + dynamoTableProps: defaults.DefaultTableProps, }; - const existingTableInterface = new dynamodb.Table(stack, 'DynamoTable', tableProps) - ; - const newProps = { - existingTableInterface, - existingTableObj: existingTableInterface - }; const app = () => { - defaults.buildDynamoDBTable(stack, newProps); + defaults.CheckDynamoDBProps(props); }; - expect(app).toThrowError('Error - Either provide existingTableInterface or existingTableObj, but not both.\n'); + // Assertion + expect(app).toThrowError('Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'); }); -test('Test providing both existingTableInterface and dynamoTableProps', () => { +test('Test fail DynamoDB table check (for interface AND obj)', () => { const stack = new Stack(); - const dynamoTableProps: dynamodb.TableProps = { - partitionKey: { - name: 'table_id', - type: dynamodb.AttributeType.STRING - }, - stream: dynamodb.StreamViewType.NEW_IMAGE + const props: defaults.DynamoDBProps = { + existingTableInterface: new dynamodb.Table(stack, 'placeholder', defaults.DefaultTableProps), + existingTableObj: new dynamodb.Table(stack, 'placeholderobj', defaults.DefaultTableProps), }; - const existingTableInterface = new dynamodb.Table(stack, 'DynamoTable', dynamoTableProps) - ; - const newProps = { - existingTableInterface, - dynamoTableProps - }; const app = () => { - defaults.buildDynamoDBTable(stack, newProps); + defaults.CheckDynamoDBProps(props); }; - expect(app).toThrowError('Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'); + // Assertion + expect(app).toThrowError('Error - Either provide existingTableInterface or existingTableObj, but not both.\n'); }); - -test('Test providing both existingTableObj and dynamoTableProps', () => { - const stack = new Stack(); - - const dynamoTableProps: dynamodb.TableProps = { - partitionKey: { - name: 'table_id', - type: dynamodb.AttributeType.STRING - }, - stream: dynamodb.StreamViewType.NEW_IMAGE - }; - - const existingTableObj = new dynamodb.Table(stack, 'DynamoTable', dynamoTableProps) - ; - const newProps = { - existingTableObj, - dynamoTableProps - }; - const app = () => { - defaults.buildDynamoDBTable(stack, newProps); - }; - - expect(app).toThrowError('Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'); -}); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/core/test/eventbridge-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/eventbridge-helper.test.ts index a9b81c64f..c2b4c0b9a 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/eventbridge-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/eventbridge-helper.test.ts @@ -63,4 +63,24 @@ test('Test deployment with new EventBus with props', () => { Template.fromStack(stack).hasResourceProperties('AWS::Events::EventBus', { Name: 'testneweventbus' }); -}); \ No newline at end of file +}); + +// --------------------------- +// Prop Tests +// --------------------------- + +test('Test fail EventBridge bad bus props', () => { + const stack = new Stack(); + + const props: defaults.EventBridgeProps = { + existingEventBusInterface: new events.EventBus(stack, 'test', {}), + eventBusProps: {} + }; + + const app = () => { + defaults.CheckEventBridgeProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide existingEventBusInterface or eventBusProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts index f116c94bc..9a2e159d8 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/glue-job-helper.test.ts @@ -18,6 +18,7 @@ import { Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam'; import { Bucket, BucketEncryption } from 'aws-cdk-lib/aws-s3'; import { RemovalPolicy, Stack } from "aws-cdk-lib"; import * as defaults from '..'; +import * as iam from 'aws-cdk-lib/aws-iam'; test('Test deployment with role creation', () => { // Stack @@ -515,3 +516,103 @@ test('Cannot use maxCapacity and WorkerType, so error out', () => { expect(error).toBeInstanceOf(Error); } }); + +// --------------------------- +// Prop Tests +// --------------------------- +test('Test fail Glue job check', () => { + const stack = new Stack(); + + const _jobRole = new iam.Role(stack, 'CustomETLJobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }); + + const jobProps: CfnJobProps = defaults.DefaultGlueJobProps(_jobRole, { + command: { + name: 'glueetl', + pythonVersion: '3', + scriptLocation: new Bucket(stack, 'ScriptBucket').bucketArn, + }, + role: new iam.Role(stack, 'JobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }).roleArn + }, 'testETLJob', {}); + + const job = new CfnJob(stack, 'placeholder', jobProps); + + const props: defaults.GlueProps = { + glueJobProps: jobProps, + existingGlueJob: job + }; + + const app = () => { + defaults.CheckGlueProps(props); + }; + + // Assertion + expect(app).toThrowError("Error - Either provide glueJobProps or existingGlueJob, but not both.\n"); +}); + +test('Test bad Glue script location', () => { + const stack = new Stack(); + + const _jobRole = new iam.Role(stack, 'CustomETLJobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }); + + const jobProps: CfnJobProps = defaults.DefaultGlueJobProps(_jobRole, { + command: { + name: 'glueetl', + pythonVersion: '3', + scriptLocation: "s://bad/url", + }, + role: new iam.Role(stack, 'JobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }).roleArn + }, 'testETLJob', {}); + + const props: defaults.GlueProps = { + glueJobProps: jobProps, + }; + + const app = () => { + defaults.CheckGlueProps(props); + }; + + // Assertion + expect(app).toThrowError('Invalid S3 URL for Glue script provided\n'); +}); + +test('Test missing Glue script location', () => { + const stack = new Stack(); + + const _jobRole = new iam.Role(stack, 'CustomETLJobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }); + + const jobProps: CfnJobProps = defaults.DefaultGlueJobProps(_jobRole, { + command: { + name: 'glueetl', + pythonVersion: '3', + }, + role: new iam.Role(stack, 'JobRole', { + assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') + }).roleArn + }, 'testETLJob', {}); + + const props: defaults.GlueProps = { + glueJobProps: jobProps, + }; + + const app = () => { + defaults.CheckGlueProps(props); + }; + + const expectedError: string = 'Either one of CfnJob.JobCommandProperty.scriptLocation or etlCodeAsset has ' + + 'to be provided. If the ETL Job code file exists in a local filesystem, please set ' + + 'KinesisstreamsToGluejobProps.etlCodeAsset. If the ETL Job is available in an S3 bucket, set the ' + + 'CfnJob.JobCommandProperty.scriptLocation property\n'; + + // Assertion + expect(app).toThrowError(expectedError); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts b/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts deleted file mode 100644 index f9a7caf2a..000000000 --- a/source/patterns/@aws-solutions-constructs/core/test/input-validation.test.ts +++ /dev/null @@ -1,679 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -// Imports -import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; -import * as glue from 'aws-cdk-lib/aws-glue'; -import * as iam from 'aws-cdk-lib/aws-iam'; -import * as kinesis from 'aws-cdk-lib/aws-kinesis'; -import * as kms from 'aws-cdk-lib/aws-kms'; -import * as lambda from 'aws-cdk-lib/aws-lambda'; -import * as mediastore from 'aws-cdk-lib/aws-mediastore'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as sns from 'aws-cdk-lib/aws-sns'; -import * as sqs from 'aws-cdk-lib/aws-sqs'; -import { Stack } from 'aws-cdk-lib'; -import * as defaults from '../'; -import { MediaStoreContainerProps } from '../lib/mediastore-defaults'; -import { BuildSagemakerEndpoint } from '../lib/sagemaker-helper'; -import { CreateScrapBucket } from './test-helper'; - -test('Test with valid props', () => { - const props: defaults.VerifiedProps = { - }; - - defaults.CheckProps(props); -}); - -// --------------------------- -// DynamoDB Prop Tests -// --------------------------- -test('Test fail DynamoDB table check', () => { - const stack = new Stack(); - - const props: defaults.DynamoDBProps = { - existingTableObj: new dynamodb.Table(stack, 'placeholder', defaults.DefaultTableProps), - dynamoTableProps: defaults.DefaultTableProps, - }; - - const app = () => { - defaults.CheckDynamoDBProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide existingTableObj or dynamoTableProps, but not both.\n'); -}); - -test('Test fail DynamoDB table check (for interface)', () => { - const stack = new Stack(); - - const props: defaults.DynamoDBProps = { - existingTableInterface: new dynamodb.Table(stack, 'placeholder', defaults.DefaultTableProps), - dynamoTableProps: defaults.DefaultTableProps, - }; - - const app = () => { - defaults.CheckDynamoDBProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide existingTableInterface or dynamoTableProps, but not both.\n'); -}); - -// --------------------------- -// Lambda Prop Tests -// --------------------------- -test("Test fail Lambda function check", () => { - const stack = new Stack(); - - const props: defaults.LambdaProps = { - lambdaFunctionProps: { - code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_16_X, - handler: "index.handler", - }, - existingLambdaObj: new lambda.Function(stack, "placeholder", { - code: lambda.Code.fromAsset(`${__dirname}/lambda`), - runtime: lambda.Runtime.NODEJS_16_X, - handler: "index.handler", - }), - }; - - const app = () => { - defaults.CheckLambdaProps(props); - }; - - // Assertion - expect(app).toThrowError( - "Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n" - ); -}); -// --------------------------- - -// --------------------------- -// SQS Prop Tests -// --------------------------- -test("Test fail SQS Queue check", () => { - const stack = new Stack(); - - const props: defaults.SqsProps = { - queueProps: {}, - existingQueueObj: new sqs.Queue(stack, 'placeholder', {}), - }; - - const app = () => { - defaults.CheckSqsProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide queueProps or existingQueueObj, but not both.\n'); -}); - -test('Test fail SQS queue check when queueProps.encryptionMasterKey and encryptionKey are both specified', () => { - const stack = new Stack(); - - const props: defaults.SqsProps = { - queueProps: { - encryptionMasterKey: new kms.Key(stack, 'key') - }, - encryptionKey: new kms.Key(stack, 'otherkey') - }; - - const app = () => { - defaults.CheckSqsProps(props); - }; - - expect(app).toThrowError('Error - Either provide queueProps.encryptionMasterKey or encryptionKey, but not both.\n'); -}); - -test('Test fail SQS queue check when queueProps.encryptionMasterKey and encryptionKeyProps are both specified', () => { - const stack = new Stack(); - - const props: defaults.SqsProps = { - encryptionKeyProps: { - description: 'key description' - }, - queueProps: { - encryptionMasterKey: new kms.Key(stack, 'key') - } - }; - - const app = () => { - defaults.CheckSqsProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide queueProps.encryptionMasterKey or encryptionKeyProps, but not both.\n'); -}); - -test('Test fail Dead Letter Queue check', () => { - - const props: defaults.SqsProps = { - deployDeadLetterQueue: false, - deadLetterQueueProps: {}, - }; - - const app = () => { - defaults.CheckSqsProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - If deployDeadLetterQueue is false then deadLetterQueueProps cannot be specified.\n'); -}); - -test('Test fail Dead Letter Queue check with queueProps fifo set to true and undefined deadLetterQueueProps', () => { - - const props: defaults.SqsProps = { - queueProps: { fifo: true }, - deadLetterQueueProps: {}, - }; - - const app = () => { - defaults.CheckSqsProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + - 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); -}); - -test('Test fail Dead Letter Queue check with queueProps fifo set to true and deadLetterQueueProps fifo set to false', () => { - - const props: defaults.SqsProps = { - queueProps: { fifo: true }, - deadLetterQueueProps: { fifo: false }, - }; - - const app = () => { - defaults.CheckSqsProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + - 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); -}); - -test('Test fail Dead Letter Queue check with queueProps fifo set to false and deadLetterQueueProps fifo set to true', () => { - - const props: defaults.SqsProps = { - deadLetterQueueProps: { fifo: true }, - queueProps: { fifo: false }, - }; - - const app = () => { - defaults.CheckSqsProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + - 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); -}); - -test('Test fail Dead Letter Queue check with deadLetterQueueProps fifo set to true', () => { - - const props: defaults.SqsProps = { - deadLetterQueueProps: { fifo: true }, - }; - - const app = () => { - defaults.CheckSqsProps(props); - }; - - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + - 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); -}); - -test('Test fail Dead Letter Queue check with queueProps fifo set to false', () => { - - const props: defaults.SqsProps = { - queueProps: { fifo: false }, - }; - - const app = () => { - defaults.CheckSqsProps(props); - }; - - expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + - 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); -}); - -test("Test fail MediaStore container check", () => { - const stack = new Stack(); - - const mediaStoreContainer = new mediastore.CfnContainer( - stack, - "placeholder", - MediaStoreContainerProps() - ); - - const props: defaults.MediaStoreProps = { - mediaStoreContainerProps: MediaStoreContainerProps(), - existingMediaStoreContainerObj: mediaStoreContainer, - }; - - const app = () => { - defaults.CheckMediaStoreProps(props); - }; - - // Assertion - expect(app).toThrowError( - "Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n" - ); -}); - -test('Test fail Kinesis stream check', () => { - const stack = new Stack(); - - const stream = new kinesis.Stream(stack, 'placeholder', { - - }); - - const props: defaults.VerifiedProps = { - existingStreamObj: stream, - kinesisStreamProps: {} - }; - - const app = () => { - defaults.CheckProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'); -}); - -// --------------------------- -// Sns Prop Tests -// --------------------------- -test('Test fail SNS topic check', () => { - const stack = new Stack(); - - const props: defaults.SnsProps = { - topicProps: {}, - existingTopicObj: new sns.Topic(stack, 'placeholder', {}) - }; - - const app = () => { - defaults.CheckSnsProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide topicProps or existingTopicObj, but not both.\n'); -}); - -test('Test fail SNS topic check with bad topic attribute name', () => { - const stack = new Stack(); - - const props: defaults.SnsProps = { - topicProps: {}, - existingTopicObj: new sns.Topic(stack, 'placeholder', {}) - }; - - const app = () => { - defaults.CheckSnsProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide topicProps or existingTopicObj, but not both.\n'); -}); - -test('Test fail SNS topic check when both encryptionKey and encryptionKeyProps are specified', () => { - const stack = new Stack(); - - const props: defaults.VerifiedProps = { - encryptionKey: new kms.Key(stack, 'key'), - encryptionKeyProps: { - description: 'a description' - } - }; - - const app = () => { - defaults.CheckProps(props); - }; - - expect(app).toThrowError('Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'); -}); - -test('Test fail SNS topic check when both topicProps.masterKey and encryptionKeyProps are specified', () => { - const stack = new Stack(); - - const props: defaults.SnsProps = { - topicProps: { - masterKey: new kms.Key(stack, 'key') - }, - encryptionKeyProps: { - description: 'a description' - } - }; - - const app = () => { - defaults.CheckSnsProps(props); - }; - - expect(app).toThrowError('Error - Either provide topicProps.masterKey or encryptionKeyProps, but not both.\n'); -}); - -test('Test fail SNS topic check when both encryptionKey and topicProps.masterKey are specified', () => { - const stack = new Stack(); - - const props: defaults.SnsProps = { - encryptionKey: new kms.Key(stack, 'key'), - topicProps: { - masterKey: new kms.Key(stack, 'otherkey') - } - }; - - const app = () => { - defaults.CheckSnsProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide topicProps.masterKey or encryptionKey, but not both.\n'); -}); -// --------------------------- - -// --------------------------- -// Glue Prop Tests -// --------------------------- -test('Test fail Glue job check', () => { - const stack = new Stack(); - - const _jobRole = new iam.Role(stack, 'CustomETLJobRole', { - assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') - }); - - const jobProps: glue.CfnJobProps = defaults.DefaultGlueJobProps(_jobRole, { - command: { - name: 'glueetl', - pythonVersion: '3', - scriptLocation: new s3.Bucket(stack, 'ScriptBucket').bucketArn, - }, - role: new iam.Role(stack, 'JobRole', { - assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') - }).roleArn - }, 'testETLJob', {}); - - const job = new glue.CfnJob(stack, 'placeholder', jobProps); - - const props: defaults.GlueProps = { - glueJobProps: jobProps, - existingGlueJob: job - }; - - const app = () => { - defaults.CheckGlueProps(props); - }; - - // Assertion - expect(app).toThrowError("Error - Either provide glueJobProps or existingGlueJob, but not both.\n"); -}); - -test('Test bad Glue script location', () => { - const stack = new Stack(); - - const _jobRole = new iam.Role(stack, 'CustomETLJobRole', { - assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') - }); - - const jobProps: glue.CfnJobProps = defaults.DefaultGlueJobProps(_jobRole, { - command: { - name: 'glueetl', - pythonVersion: '3', - scriptLocation: "s://bad/url", - }, - role: new iam.Role(stack, 'JobRole', { - assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') - }).roleArn - }, 'testETLJob', {}); - - const props: defaults.GlueProps = { - glueJobProps: jobProps, - }; - - const app = () => { - defaults.CheckGlueProps(props); - }; - - // Assertion - expect(app).toThrowError('Invalid S3 URL for Glue script provided\n'); -}); - -test('Test missing Glue script location', () => { - const stack = new Stack(); - - const _jobRole = new iam.Role(stack, 'CustomETLJobRole', { - assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') - }); - - const jobProps: glue.CfnJobProps = defaults.DefaultGlueJobProps(_jobRole, { - command: { - name: 'glueetl', - pythonVersion: '3', - }, - role: new iam.Role(stack, 'JobRole', { - assumedBy: new iam.ServicePrincipal('glue.amazonaws.com') - }).roleArn - }, 'testETLJob', {}); - - const props: defaults.GlueProps = { - glueJobProps: jobProps, - }; - - const app = () => { - defaults.CheckGlueProps(props); - }; - - const expectedError: string = 'Either one of CfnJob.JobCommandProperty.scriptLocation or etlCodeAsset has ' + - 'to be provided. If the ETL Job code file exists in a local filesystem, please set ' + - 'KinesisstreamsToGluejobProps.etlCodeAsset. If the ETL Job is available in an S3 bucket, set the ' + - 'CfnJob.JobCommandProperty.scriptLocation property\n'; - - // Assertion - expect(app).toThrowError(expectedError); -}); -// --------------------------- - -test('Test fail SageMaker endpoint check', () => { - const stack = new Stack(); - - // Build Sagemaker Inference Endpoint - const modelProps = { - primaryContainer: { - image: ".dkr.ecr..amazonaws.com/linear-learner:latest", - modelDataUrl: "s3:////model.tar.gz", - }, - }; - - const buildSagemakerEndpointResponse = BuildSagemakerEndpoint(stack, { modelProps }); - - const props: defaults.SagemakerProps = { - existingSagemakerEndpointObj: buildSagemakerEndpointResponse.endpoint, - endpointProps: { - endpointConfigName: 'placeholder' - } - }; - - const app = () => { - defaults.CheckSagemakerProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'); -}); - -test('Test fail Secret check', () => { - const stack = new Stack(); - - const props: defaults.VerifiedProps = { - secretProps: {}, - existingSecretObj: defaults.buildSecretsManagerSecret(stack, 'secret', {}), - }; - - const app = () => { - defaults.CheckProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide secretProps or existingSecretObj, but not both.\n'); -}); - -test('Test fail encryption key check', () => { - const stack = new Stack(); - - const key = defaults.buildEncryptionKey(stack, { - enableKeyRotation: false - }); - - const props: defaults.VerifiedProps = { - encryptionKey: key, - encryptionKeyProps: {}, - }; - - const app = () => { - defaults.CheckProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'); -}); - -// --------------------------- -// VPC Prop Tests -// --------------------------- -test('Test fail Vpc check with deployVpc', () => { - const stack = new Stack(); - - const props: defaults.VpcPropsSet = { - deployVpc: true, - existingVpc: defaults.buildVpc(stack, { - defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), - }), - }; - - const app = () => { - defaults.CheckVpcProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); -}); - -test('Test fail Vpc check with vpcProps', () => { - const stack = new Stack(); - - const props: defaults.VpcPropsSet = { - vpcProps: defaults.DefaultPublicPrivateVpcProps(), - existingVpc: defaults.buildVpc(stack, { - defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), - }), - }; - - const app = () => { - defaults.CheckVpcProps(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); -}); -// --------------------------- - -// --------------------------- -// S3 Prop Tests -// --------------------------- -test('Test fail S3 check', () => { - const stack = new Stack(); - - const props: defaults.S3Props = { - existingBucketObj: CreateScrapBucket(stack, {}), - bucketProps: {}, - }; - - const app = () => { - defaults.CheckS3Props(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); -}); - -test('Test fail existing log bucket and log bucket prop check', () => { - const stack = new Stack(); - - const props: defaults.S3Props = { - existingLoggingBucketObj: new s3.Bucket(stack, 'logging-bucket'), - loggingBucketProps: { - autoDeleteObjects: true - } - }; - - const app = () => { - defaults.CheckS3Props(props); - }; - - // Assertion - expect(app).toThrowError('Error - Either provide existingLoggingBucketObj or loggingBucketProps, but not both.\n'); -}); - -test('Test fail false logS3Accesslogs and loggingBucketProps check', () => { - const stack = new Stack(); - - const props: defaults.S3Props = { - existingLoggingBucketObj: new s3.Bucket(stack, 'logging-bucket'), - logS3AccessLogs: false - }; - - const app = () => { - defaults.CheckS3Props(props); - }; - - // Assertion - expect(app).toThrowError('Error - If logS3AccessLogs is false, supplying loggingBucketProps or existingLoggingBucketObj is invalid.\n'); -}); - -test('Test fail existingBucketObj and loggingBucketProps check', () => { - const stack = new Stack(); - - const props: defaults.S3Props = { - existingBucketObj: new s3.Bucket(stack, 'temp-bucket'), - loggingBucketProps: { - autoDeleteObjects: true - } - }; - - const app = () => { - defaults.CheckS3Props(props); - }; - - // Assertion - expect(app).toThrowError('Error - If existingBucketObj is provided, supplying loggingBucketProps or logS3AccessLogs is an error.\n'); -}); -// --------------------------- - -test('Test successful CheckListValues', () => { - - const app = () => { - defaults.CheckListValues(['one', 'two', 'four'], ['four', 'one'], 'test value'); - }; - - // Assertion - expect(app).not.toThrowError(); -}); - -test('Test unsuccessful CheckListValues', () => { - - const app = () => { - defaults.CheckListValues(['one', 'two', 'four'], ['four', 'three'], 'test value'); - }; - - // Assertion - expect(app).toThrowError('Invalid test value submitted - three'); -}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/kinesis-streams-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/kinesis-streams-helper.test.ts index 485c3430b..12e63a482 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/kinesis-streams-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/kinesis-streams-helper.test.ts @@ -17,9 +17,6 @@ import * as defaults from '../'; import * as kinesis from 'aws-cdk-lib/aws-kinesis'; import { Template } from 'aws-cdk-lib/assertions'; -// -------------------------------------------------------------- -// Test minimal deployment with no properties -// -------------------------------------------------------------- test('Test minimal deployment with no properties', () => { // Stack const stack = new Stack(); @@ -36,9 +33,6 @@ test('Test minimal deployment with no properties', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ custom properties -// -------------------------------------------------------------- test('Test deployment w/ custom properties', () => { // Stack const stack = new Stack(); @@ -63,9 +57,6 @@ test('Test deployment w/ custom properties', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ existing stream -// -------------------------------------------------------------- test('Test deployment w/ existing stream', () => { // Stack const stack = new Stack(); @@ -97,4 +88,27 @@ test('Count Kinesis CW Alarms', () => { const cwList = defaults.buildKinesisStreamCWAlarms(stack); expect(cwList.length).toEqual(2); -}); \ No newline at end of file +}); + +// --------------------------- +// Prop Tests +// --------------------------- +test('Test fail Kinesis stream check', () => { + const stack = new Stack(); + + const stream = new kinesis.Stream(stack, 'placeholder', { + + }); + + const props: defaults.KinesisStreamProps = { + existingStreamObj: stream, + kinesisStreamProps: {} + }; + + const app = () => { + defaults.CheckKinesisStreamProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide existingStreamObj or kinesisStreamProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts index 08e04d178..00a521ac8 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts @@ -561,3 +561,32 @@ test('buildLambdaFunction uses default name when neither constructId or function }, }); }); + +// --------------------------- +// Prop Tests +// --------------------------- +test("Test fail Lambda function check", () => { + const stack = new Stack(); + + const props: defaults.LambdaProps = { + lambdaFunctionProps: { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: "index.handler", + }, + existingLambdaObj: new lambda.Function(stack, "placeholder", { + code: lambda.Code.fromAsset(`${__dirname}/lambda`), + runtime: lambda.Runtime.NODEJS_16_X, + handler: "index.handler", + }), + }; + + const app = () => { + defaults.CheckLambdaProps(props); + }; + + // Assertion + expect(app).toThrowError( + "Error - Either provide lambdaFunctionProps or existingLambdaObj, but not both.\n" + ); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/mediastore-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/mediastore-helper.test.ts index b2c2e295c..8e8746dea 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/mediastore-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/mediastore-helper.test.ts @@ -15,6 +15,8 @@ import { Template } from 'aws-cdk-lib/assertions'; import { Stack } from 'aws-cdk-lib'; import * as mediastore from 'aws-cdk-lib/aws-mediastore'; import { MediaStoreContainer } from '../lib/mediastore-helper'; +import { MediaStoreContainerProps } from '../lib/mediastore-defaults'; +import * as defaults from '../'; test('MediaStore container override params', () => { const stack = new Stack(); @@ -46,4 +48,31 @@ test('MediaStore container override params', () => { LifecyclePolicy: '{}', ContainerName: 'TestContainer' }); -}); \ No newline at end of file +}); + +// --------------------------- +// Prop Tests +// --------------------------- +test("Test fail MediaStore container check", () => { + const stack = new Stack(); + + const mediaStoreContainer = new mediastore.CfnContainer( + stack, + "placeholder", + MediaStoreContainerProps() + ); + + const props: defaults.MediaStoreProps = { + mediaStoreContainerProps: MediaStoreContainerProps(), + existingMediaStoreContainerObj: mediaStoreContainer, + }; + + const app = () => { + defaults.CheckMediaStoreProps(props); + }; + + // Assertion + expect(app).toThrowError( + "Error - Either provide mediaStoreContainerProps or existingMediaStoreContainerObj, but not both.\n" + ); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/s3-bucket.test.ts b/source/patterns/@aws-solutions-constructs/core/test/s3-bucket.test.ts index b3e5b0176..f36fd43e8 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/s3-bucket.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/s3-bucket.test.ts @@ -18,6 +18,7 @@ import * as defaults from '../index'; import { overrideProps } from '../lib/utils'; import { Template } from 'aws-cdk-lib/assertions'; import { expectNonexistence } from "./test-helper"; +import { CreateScrapBucket } from './test-helper'; test('test s3Bucket override versioningConfiguration', () => { const stack = new Stack(); @@ -359,4 +360,75 @@ test('Test enforcing SSL when bucketProps is provided and enforceSSL is not set' Version: "2012-10-17" } }); -}); \ No newline at end of file +}); + +// --------------------------- +// Prop Tests +// --------------------------- +test('Test fail S3 check', () => { + const stack = new Stack(); + + const props: defaults.S3Props = { + existingBucketObj: CreateScrapBucket(stack, {}), + bucketProps: {}, + }; + + const app = () => { + defaults.CheckS3Props(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide bucketProps or existingBucketObj, but not both.\n'); +}); + +test('Test fail existing log bucket and log bucket prop check', () => { + const stack = new Stack(); + + const props: defaults.S3Props = { + existingLoggingBucketObj: new s3.Bucket(stack, 'logging-bucket'), + loggingBucketProps: { + autoDeleteObjects: true + } + }; + + const app = () => { + defaults.CheckS3Props(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide existingLoggingBucketObj or loggingBucketProps, but not both.\n'); +}); + +test('Test fail false logS3Accesslogs and loggingBucketProps check', () => { + const stack = new Stack(); + + const props: defaults.S3Props = { + existingLoggingBucketObj: new s3.Bucket(stack, 'logging-bucket'), + logS3AccessLogs: false + }; + + const app = () => { + defaults.CheckS3Props(props); + }; + + // Assertion + expect(app).toThrowError('Error - If logS3AccessLogs is false, supplying loggingBucketProps or existingLoggingBucketObj is invalid.\n'); +}); + +test('Test fail existingBucketObj and loggingBucketProps check', () => { + const stack = new Stack(); + + const props: defaults.S3Props = { + existingBucketObj: new s3.Bucket(stack, 'temp-bucket'), + loggingBucketProps: { + autoDeleteObjects: true + } + }; + + const app = () => { + defaults.CheckS3Props(props); + }; + + // Assertion + expect(app).toThrowError('Error - If existingBucketObj is provided, supplying loggingBucketProps or logS3AccessLogs is an error.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/sagemaker-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/sagemaker-helper.test.ts index a13347c82..d496d5633 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/sagemaker-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/sagemaker-helper.test.ts @@ -17,6 +17,7 @@ import * as kms from 'aws-cdk-lib/aws-kms'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as defaults from '../'; import { Template } from 'aws-cdk-lib/assertions'; +import { BuildSagemakerEndpoint } from '../lib/sagemaker-helper'; test('Test deployment with VPC', () => { // Stack @@ -237,3 +238,34 @@ test('Test exception for not providing private or isolated subnets in an existin // Assertion 1 expect(app).toThrowError(); }); + +// --------------------------- +// Prop Tests +// --------------------------- +test('Test fail SageMaker endpoint check', () => { + const stack = new Stack(); + + // Build Sagemaker Inference Endpoint + const modelProps = { + primaryContainer: { + image: ".dkr.ecr..amazonaws.com/linear-learner:latest", + modelDataUrl: "s3:////model.tar.gz", + }, + }; + + const buildSagemakerEndpointResponse = BuildSagemakerEndpoint(stack, { modelProps }); + + const props: defaults.SagemakerProps = { + existingSagemakerEndpointObj: buildSagemakerEndpointResponse.endpoint, + endpointProps: { + endpointConfigName: 'placeholder' + } + }; + + const app = () => { + defaults.CheckSagemakerProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide endpointProps or existingSagemakerEndpointObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/secretsmanager-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/secretsmanager-helper.test.ts index b6b1717c1..4e6337cd7 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/secretsmanager-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/secretsmanager-helper.test.ts @@ -18,9 +18,6 @@ import { Template } from 'aws-cdk-lib/assertions'; const DESCRIPTION = 'test secret description'; const SECRET_NAME = 'test secret name'; -// -------------------------------------------------------------- -// Test minimal deployment with no properties -// -------------------------------------------------------------- test('Test minimal deployment with no properties', () => { // Stack const stack = new Stack(); @@ -34,9 +31,6 @@ test('Test minimal deployment with no properties', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ custom properties -// -------------------------------------------------------------- test('Test deployment with custom properties', () => { // Stack const stack = new Stack(); @@ -57,3 +51,23 @@ test('Test deployment with custom properties', () => { } }); }); + +// --------------------------- +// Prop Tests +// --------------------------- + +test('Test fail Secret check', () => { + const stack = new Stack(); + + const props: defaults.SecretsManagerProps = { + secretProps: {}, + existingSecretObj: defaults.buildSecretsManagerSecret(stack, 'secret', {}), + }; + + const app = () => { + defaults.CheckSecretsManagerProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide secretProps or existingSecretObj, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/sns-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/sns-helper.test.ts index 225b15abe..a0ecf4812 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/sns-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/sns-helper.test.ts @@ -307,3 +307,112 @@ test('existing unencrypted topic is not overridden with defaults', () => { template.resourceCountIs('AWS::KMS::Key', 0); template.resourceCountIs('AWS::SNS::Topic', 1); }); + +// --------------------------- +// Prop Tests +// --------------------------- +test('Test fail SNS topic check', () => { + const stack = new Stack(); + + const props: defaults.SnsProps = { + topicProps: {}, + existingTopicObj: new sns.Topic(stack, 'placeholder', {}) + }; + + const app = () => { + defaults.CheckSnsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide topicProps or existingTopicObj, but not both.\n'); +}); + +test('Test fail SNS topic check with bad topic attribute name', () => { + const stack = new Stack(); + + const props: defaults.SnsProps = { + topicProps: {}, + existingTopicObj: new sns.Topic(stack, 'placeholder', {}) + }; + + const app = () => { + defaults.CheckSnsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide topicProps or existingTopicObj, but not both.\n'); +}); + +test('Test fail SNS topic check when both encryptionKey and encryptionKeyProps are specified', () => { + const stack = new Stack(); + + const props: defaults.SnsProps = { + encryptionKey: new kms.Key(stack, 'key'), + encryptionKeyProps: { + description: 'a description' + } + }; + + const app = () => { + defaults.CheckSnsProps(props); + }; + + expect(app).toThrowError('Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'); +}); + +test('Test fail SNS topic check when both topicProps.masterKey and encryptionKeyProps are specified', () => { + const stack = new Stack(); + + const props: defaults.SnsProps = { + topicProps: { + masterKey: new kms.Key(stack, 'key') + }, + encryptionKeyProps: { + description: 'a description' + } + }; + + const app = () => { + defaults.CheckSnsProps(props); + }; + + expect(app).toThrowError('Error - Either provide topicProps.masterKey or encryptionKeyProps, but not both.\n'); +}); + +test('Test fail SNS topic check when both encryptionKey and topicProps.masterKey are specified', () => { + const stack = new Stack(); + + const props: defaults.SnsProps = { + encryptionKey: new kms.Key(stack, 'key'), + topicProps: { + masterKey: new kms.Key(stack, 'otherkey') + } + }; + + const app = () => { + defaults.CheckSnsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide topicProps.masterKey or encryptionKey, but not both.\n'); +}); + +test('Test fail encryption key check', () => { + const stack = new Stack(); + + const key = defaults.buildEncryptionKey(stack, { + enableKeyRotation: false + }); + + const props: defaults.SnsProps = { + encryptionKey: key, + encryptionKeyProps: {}, + }; + + const app = () => { + defaults.CheckSnsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/sqs-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/sqs-helper.test.ts index 44ce77d05..2d48bda4b 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/sqs-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/sqs-helper.test.ts @@ -190,3 +190,168 @@ test('Test creating a FIFO queue', () => { }); expect(buildQueueResponse.queue.fifo).toBe(true); }); + +// --------------------------- +// Prop Tests +// --------------------------- + +test("Test fail SQS Queue check", () => { + const stack = new Stack(); + + const props: defaults.SqsProps = { + queueProps: {}, + existingQueueObj: new sqs.Queue(stack, 'placeholder', {}), + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide queueProps or existingQueueObj, but not both.\n'); +}); + +test('Test fail SQS queue check when queueProps.encryptionMasterKey and encryptionKey are both specified', () => { + const stack = new Stack(); + + const props: defaults.SqsProps = { + queueProps: { + encryptionMasterKey: new kms.Key(stack, 'key') + }, + encryptionKey: new kms.Key(stack, 'otherkey') + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + expect(app).toThrowError('Error - Either provide queueProps.encryptionMasterKey or encryptionKey, but not both.\n'); +}); + +test('Test fail SQS queue check when queueProps.encryptionMasterKey and encryptionKeyProps are both specified', () => { + const stack = new Stack(); + + const props: defaults.SqsProps = { + encryptionKeyProps: { + description: 'key description' + }, + queueProps: { + encryptionMasterKey: new kms.Key(stack, 'key') + } + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide queueProps.encryptionMasterKey or encryptionKeyProps, but not both.\n'); +}); + +test('Test fail SQS check when both encryptionKey and encryptionKeyProps are specified', () => { + const stack = new Stack(); + + const props: defaults.SqsProps = { + encryptionKey: new kms.Key(stack, 'key'), + encryptionKeyProps: { + description: 'a description' + } + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + expect(app).toThrowError('Error - Either provide encryptionKey or encryptionKeyProps, but not both.\n'); +}); + +test('Test fail Dead Letter Queue check', () => { + + const props: defaults.SqsProps = { + deployDeadLetterQueue: false, + deadLetterQueueProps: {}, + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - If deployDeadLetterQueue is false then deadLetterQueueProps cannot be specified.\n'); +}); + +test('Test fail Dead Letter Queue check with queueProps fifo set to true and undefined deadLetterQueueProps', () => { + + const props: defaults.SqsProps = { + queueProps: { fifo: true }, + deadLetterQueueProps: {}, + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); +}); + +test('Test fail Dead Letter Queue check with queueProps fifo set to true and deadLetterQueueProps fifo set to false', () => { + + const props: defaults.SqsProps = { + queueProps: { fifo: true }, + deadLetterQueueProps: { fifo: false }, + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); +}); + +test('Test fail Dead Letter Queue check with queueProps fifo set to false and deadLetterQueueProps fifo set to true', () => { + + const props: defaults.SqsProps = { + deadLetterQueueProps: { fifo: true }, + queueProps: { fifo: false }, + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); +}); + +test('Test fail Dead Letter Queue check with deadLetterQueueProps fifo set to true', () => { + + const props: defaults.SqsProps = { + deadLetterQueueProps: { fifo: true }, + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); +}); + +test('Test fail Dead Letter Queue check with queueProps fifo set to false', () => { + + const props: defaults.SqsProps = { + queueProps: { fifo: false }, + }; + + const app = () => { + defaults.CheckSqsProps(props); + }; + + expect(app).toThrowError('Error - If you specify a fifo: true in either queueProps or deadLetterQueueProps, you must also set fifo: ' + + 'true in the other props object. Fifo must match for the Queue and the Dead Letter Queue.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/utils.test.ts b/source/patterns/@aws-solutions-constructs/core/test/utils.test.ts index 6597b2154..88a1a9c9e 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/utils.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/utils.test.ts @@ -212,3 +212,39 @@ test('Test generateName uniqueness', () => { const nameTwo = defaults.generateName(stackTwo, ""); expect(nameOne === nameTwo).toBe(false); }); + +test('Test successful CheckListValues', () => { + + const app = () => { + defaults.CheckListValues(['one', 'two', 'four'], ['four', 'one'], 'test value'); + }; + + // Assertion + expect(app).not.toThrowError(); +}); + +test('Test fail OpenSearch improper vpc specification', () => { + + const props: defaults.OpenSearchProps = { + openSearchDomainProps: { + vpcOptions: {} + }, + }; + + const app = () => { + defaults.CheckOpenSearchProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Define VPC using construct parameters not the OpenSearch Service props\n'); +}); + +test('Test unsuccessful CheckListValues', () => { + + const app = () => { + defaults.CheckListValues(['one', 'two', 'four'], ['four', 'three'], 'test value'); + }; + + // Assertion + expect(app).toThrowError('Invalid test value submitted - three'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/vpc-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/vpc-helper.test.ts index 73c0b3322..3b52ad4ec 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/vpc-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/vpc-helper.test.ts @@ -18,9 +18,6 @@ import { Template } from 'aws-cdk-lib/assertions'; import { AddAwsServiceEndpoint, ServiceEndpointTypes } from '../lib/vpc-helper'; import { DefaultPublicPrivateVpcProps, DefaultIsolatedVpcProps } from '../lib/vpc-defaults'; -// -------------------------------------------------------------- -// Test minimal Isolated deployment with no properties -// -------------------------------------------------------------- test("Test minimal deployment with no properties", () => { // Stack const stack = new Stack(); @@ -39,9 +36,6 @@ test("Test minimal deployment with no properties", () => { template.resourceCountIs('AWS::EC2::InternetGateway', 0); }); -// -------------------------------------------------------------- -// Test deployment w/ user provided custom properties -// -------------------------------------------------------------- test('Test deployment w/ user provided custom properties', () => { // Stack const stack = new Stack(); @@ -61,9 +55,6 @@ test('Test deployment w/ user provided custom properties', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ construct provided custom properties -// -------------------------------------------------------------- test('Test deployment w/ construct provided custom properties', () => { // Stack const stack = new Stack(); @@ -83,9 +74,6 @@ test('Test deployment w/ construct provided custom properties', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ construct and user provided custom properties -// -------------------------------------------------------------- test('Test deployment w/ construct and user provided custom properties', () => { // Stack const stack = new Stack(); @@ -110,9 +98,6 @@ test('Test deployment w/ construct and user provided custom properties', () => { }); }); -// -------------------------------------------------------------- -// Test priority of default, user and construct properties -// -------------------------------------------------------------- test('Test deployment w/ construct and user provided custom properties', () => { // Stack const stack = new Stack(); @@ -145,9 +130,6 @@ test('Test deployment w/ construct and user provided custom properties', () => { template.resourceCountIs('AWS::EC2::InternetGateway', 0); }); -// -------------------------------------------------------------- -// Test deployment w/ existing VPC provided -// -------------------------------------------------------------- test('Test deployment w/ existing VPC provided', () => { // Stack const stack = new Stack(); @@ -162,9 +144,6 @@ test('Test deployment w/ existing VPC provided', () => { expect(newVpc).toBe(testExistingVpc); }); -// -------------------------------------------------------------- -// Test adding Gateway Endpoint -// -------------------------------------------------------------- test('Test adding Gateway Endpoint', () => { // Stack const stack = new Stack(); @@ -188,9 +167,6 @@ test('Test adding Gateway Endpoint', () => { template.resourceCountIs('AWS::EC2::VPCEndpoint', 3); }); -// -------------------------------------------------------------- -// Test adding Interface Endpoint -// -------------------------------------------------------------- test('Test adding Interface Endpoint', () => { // Stack const stack = new Stack(); @@ -207,9 +183,6 @@ test('Test adding Interface Endpoint', () => { }); }); -// -------------------------------------------------------------- -// Test adding SAGEMAKER_RUNTIME Interface Endpoint -// -------------------------------------------------------------- test('Test adding SAGEMAKER_RUNTIME Interface Endpoint', () => { // Stack const stack = new Stack(); @@ -226,9 +199,6 @@ test('Test adding SAGEMAKER_RUNTIME Interface Endpoint', () => { }); }); -// -------------------------------------------------------------- -// Test adding a second Endpoint of same service -// -------------------------------------------------------------- test('Test adding a second Endpoint of same service', () => { // Stack const stack = new Stack(); @@ -244,9 +214,6 @@ test('Test adding a second Endpoint of same service', () => { Template.fromStack(stack).resourceCountIs('AWS::EC2::VPCEndpoint', 1); }); -// -------------------------------------------------------------- -// Test adding bad Endpoint -// -------------------------------------------------------------- test('Test adding bad Endpoint', () => { // Stack const stack = new Stack(); @@ -262,9 +229,6 @@ test('Test adding bad Endpoint', () => { expect(app).toThrowError(); }); -// -------------------------------------------------------------- -// Test adding Events Interface Endpoint -// -------------------------------------------------------------- test('Test adding Events Interface Endpoint', () => { // Stack const stack = new Stack(); @@ -279,4 +243,43 @@ test('Test adding Events Interface Endpoint', () => { Template.fromStack(stack).hasResourceProperties('AWS::EC2::VPCEndpoint', { VpcEndpointType: 'Interface', }); -}); \ No newline at end of file +}); + +// --------------------------- +// Prop Tests +// --------------------------- +test('Test fail Vpc check with deployVpc', () => { + const stack = new Stack(); + + const props: defaults.VpcPropsSet = { + deployVpc: true, + existingVpc: defaults.buildVpc(stack, { + defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), + }), + }; + + const app = () => { + defaults.CheckVpcProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); + +test('Test fail Vpc check with vpcProps', () => { + const stack = new Stack(); + + const props: defaults.VpcPropsSet = { + vpcProps: defaults.DefaultPublicPrivateVpcProps(), + existingVpc: defaults.buildVpc(stack, { + defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(), + }), + }; + + const app = () => { + defaults.CheckVpcProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide an existingVpc or some combination of deployVpc and vpcProps, but not both.\n'); +}); diff --git a/source/patterns/@aws-solutions-constructs/core/test/waf-helper.test.ts b/source/patterns/@aws-solutions-constructs/core/test/waf-helper.test.ts index d93ba3d19..66fc14798 100644 --- a/source/patterns/@aws-solutions-constructs/core/test/waf-helper.test.ts +++ b/source/patterns/@aws-solutions-constructs/core/test/waf-helper.test.ts @@ -256,9 +256,6 @@ test('Test deployment w/ user provided partial custom properties', () => { }); }); -// -------------------------------------------------------------- -// Test deployment w/ existing WAF web ACL provided -// -------------------------------------------------------------- test('Test deployment w/ existing WAF web ACL provided', () => { // Stack const stack = new Stack(); @@ -269,4 +266,56 @@ test('Test deployment w/ existing WAF web ACL provided', () => { }); expect(newWaf).toBe(testWaf); -}); \ No newline at end of file +}); + +// --------------------------- +// Prop Tests +// --------------------------- +test('Test WebACL bad props', () => { + const stack = new Stack(); + const wafProps: waf.CfnWebACLProps = { + scope: 'CLOUDFRONT', + defaultAction: { + allow: {} + }, + visibilityConfig: { + cloudWatchMetricsEnabled: false, + metricName: 'webACL', + sampledRequestsEnabled: true + }, + rules: [ + defaults.wrapManagedRuleSet("AWSManagedRulesCommonRuleSet", "AWS", 0), + defaults.wrapManagedRuleSet("AWSManagedRulesWordPressRuleSet", "AWS", 1), + ] + }; + + const wafPropsTwo: waf.CfnWebACLProps = { + scope: 'CLOUDFRONT', + defaultAction: { + allow: {} + }, + visibilityConfig: { + cloudWatchMetricsEnabled: false, + metricName: 'webACL', + sampledRequestsEnabled: true + }, + rules: [ + defaults.wrapManagedRuleSet("AWSManagedRulesCommonRuleSet", "AWS", 0), + defaults.wrapManagedRuleSet("AWSManagedRulesWordPressRuleSet", "AWS", 1), + ] + }; + + const acl: waf.CfnWebACL = new waf.CfnWebACL(stack, 'test', wafProps); + + const props: defaults.WafWebAclProps = { + existingWebaclObj: acl, + webaclProps: wafPropsTwo, + }; + + const app = () => { + defaults.CheckWafWebAclProps(props); + }; + + // Assertion + expect(app).toThrowError('Error - Either provide existingWebaclObj or webaclProps, but not both.\n'); +}); From 4f4273dc3fdce492cb9ebee98caed57bb3655927 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Wed, 4 Oct 2023 16:13:19 -0400 Subject: [PATCH 54/73] Replace incorrect property checks in tests (#1017) --- .../test/apigateway-dynamodb.test.ts | 10 +++---- .../test/apigateway-kinesisstreams.test.ts | 12 ++++---- .../test/test.apigateway-lambda.test.ts | 8 ++--- .../test/apigateway-sagemakerendpoint.test.ts | 8 ++--- .../test/apigateway-sqs.test.ts | 12 ++++---- .../test.cloudfront-apigateway-lambda.test.ts | 14 ++++----- .../test/test.cloudfront-apigateway.test.ts | 8 ++--- .../test/test.cloudfront-s3.test.ts | 6 ++-- .../test.cognito-apigateway-lambda.test.ts | 14 ++++----- ...treams-lambda-elasticsearch-kibana.test.ts | 16 +++++----- .../eventbridge-kinesisfirehose-s3.test.ts | 30 +++++++++---------- .../test/eventbridge-kinesisstreams.test.ts | 14 ++++----- .../test/eventbridge-lambda.test.ts | 10 +++---- .../test/eventbridge-sns-topic.test.ts | 14 ++++----- .../test/eventbridge-sqs-queue.test.ts | 18 +++++------ .../test/eventbridge-stepfunctions.test.ts | 26 ++++++++-------- .../test/fargate-dynamodb.test.ts | 10 +++---- .../test/aws-fargate-kinesisfirehose.test.ts | 8 ++--- .../test/fargate-opensearch.test.ts | 18 +++++------ .../aws-fargate-s3/test/fargate-s3.test.ts | 10 +++---- .../test/fargate-secretsmanager.test.ts | 8 ++--- .../aws-fargate-sqs/test/fargate-sqs.test.ts | 10 +++---- .../test/fargate-ssmstringparameter.test.ts | 8 ++--- .../test/test.iot-kinesisfirehose-s3.test.ts | 14 ++++----- .../aws-iot-lambda/test/iot-lambda.test.ts | 4 +-- ...isfirehose-s3-and-kinesisanalytics.test.ts | 12 ++++---- .../test/kinesisstreams-lambda.test.ts | 12 ++++---- .../test/lambda-dynamodb.test.ts | 4 +-- .../test/aws-lambda-kinesisfirehose.test.ts | 4 +-- .../aws-lambda-s3/test/lambda-s3.test.ts | 6 ++-- .../aws-s3-lambda/test/s3-lambda.test.ts | 6 ++-- .../aws-s3-sns/test/test.s3-sns.test.ts | 10 +++---- .../aws-s3-sqs/test/test.s3-sqs.test.ts | 6 ++-- .../test/s3-stepfunctions.test.ts | 10 +++---- .../aws-sns-lambda/test/sns-lambda.test.ts | 4 +-- .../aws-sns-sqs/test/sns-sqs.test.ts | 10 +++---- .../test/test.sqs-lambda.test.ts | 6 ++-- .../test/test.wafwebacl-alb.test.ts | 4 +-- .../test/test.wafwebacl-apigateway.test.ts | 4 +-- .../test/test.wafwebacl-appsync.test.ts | 4 +-- .../test/test.wafwebacl-cloudfront.test.ts | 4 +-- 41 files changed, 208 insertions(+), 208 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/apigateway-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/apigateway-dynamodb.test.ts index 0596aedff..d3b0ca594 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/apigateway-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/apigateway-dynamodb.test.ts @@ -23,11 +23,11 @@ test("check properties", () => { const apiGatewayToDynamoDBProps: ApiGatewayToDynamoDBProps = {}; const construct = new ApiGatewayToDynamoDB( stack, "test-api-gateway-dynamodb-default", apiGatewayToDynamoDBProps); - expect(construct.dynamoTable !== null); - expect(construct.apiGateway !== null); - expect(construct.apiGatewayRole !== null); - expect(construct.apiGatewayCloudWatchRole !== null); - expect(construct.apiGatewayLogGroup !== null); + expect(construct.dynamoTable).toBeDefined(); + expect(construct.apiGateway).toBeDefined(); + expect(construct.apiGatewayRole).toBeDefined(); + expect(construct.apiGatewayCloudWatchRole).toBeDefined(); + expect(construct.apiGatewayLogGroup).toBeDefined(); }); test("check allow CRUD operations", () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts index e69db897b..a3bbaf0ff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/apigateway-kinesisstreams.test.ts @@ -21,12 +21,12 @@ test('Test construct properties', () => { const stack = new Stack(); const pattern = new ApiGatewayToKinesisStreams(stack, 'api-gateway-kinesis', {}); - expect(pattern.apiGateway !== null); - expect(pattern.apiGatewayRole !== null); - expect(pattern.apiGatewayCloudWatchRole !== null); - expect(pattern.apiGatewayLogGroup !== null); - expect(pattern.kinesisStream !== null); - expect(pattern.cloudwatchAlarms !== null); + expect(pattern.apiGateway).toBeDefined(); + expect(pattern.apiGatewayRole).toBeDefined(); + expect(pattern.apiGatewayCloudWatchRole).toBeDefined(); + expect(pattern.apiGatewayLogGroup).toBeDefined(); + expect(pattern.kinesisStream).toBeDefined(); + expect(pattern.cloudwatchAlarms).toBeDefined(); }); test('Test deployment w/ overwritten properties', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts index 119f25b4c..784eb57c5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/test.apigateway-lambda.test.ts @@ -72,11 +72,11 @@ test('Test properties', () => { }; const app = new ApiGatewayToLambda(stack, 'test-apigateway-lambda', props); // Assertion 1 - expect(app.lambdaFunction !== null); + expect(app.lambdaFunction).toBeDefined(); // Assertion 2 - expect(app.apiGateway !== null); - expect(app.apiGatewayCloudWatchRole !== null); - expect(app.apiGatewayLogGroup !== null); + expect(app.apiGateway).toBeDefined(); + expect(app.apiGatewayCloudWatchRole).toBeDefined(); + expect(app.apiGatewayLogGroup).toBeDefined(); }); test('Error on lambdaFunctionProps=undefined', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/apigateway-sagemakerendpoint.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/apigateway-sagemakerendpoint.test.ts index b43069523..472f6550d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/apigateway-sagemakerendpoint.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/apigateway-sagemakerendpoint.test.ts @@ -25,10 +25,10 @@ test('Test construct properties', () => { requestMappingTemplate: 'my-request-vtl-template' }); - expect(pattern.apiGateway !== null); - expect(pattern.apiGatewayRole !== null); - expect(pattern.apiGatewayCloudWatchRole !== null); - expect(pattern.apiGatewayLogGroup !== null); + expect(pattern.apiGateway).toBeDefined(); + expect(pattern.apiGatewayRole).toBeDefined(); + expect(pattern.apiGatewayCloudWatchRole).toBeDefined(); + expect(pattern.apiGatewayLogGroup).toBeDefined(); }); test('Test deployment w/ overwritten properties', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts index 637bc84ed..83b3907ad 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts @@ -70,14 +70,14 @@ test('Test properties', () => { maxReceiveCount: 3 }); // Assertion 1 - expect(pattern.apiGateway !== null); + expect(pattern.apiGateway).toBeDefined(); // Assertion 2 - expect(pattern.sqsQueue !== null); + expect(pattern.sqsQueue).toBeDefined(); // Assertion 3 - expect(pattern.apiGatewayRole !== null); - expect(pattern.apiGatewayCloudWatchRole !== null); - expect(pattern.apiGatewayLogGroup !== null); - expect(pattern.deadLetterQueue !== null); + expect(pattern.apiGatewayRole).toBeDefined(); + expect(pattern.apiGatewayCloudWatchRole).toBeDefined(); + expect(pattern.apiGatewayLogGroup).toBeDefined(); + expect(pattern.deadLetterQueue).toBeDefined(); }); test('Test deployment ApiGateway AuthorizationType override', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts index 0c657f914..e5e225b2d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/test.cloudfront-apigateway-lambda.test.ts @@ -47,13 +47,13 @@ test('check properties', () => { const construct: CloudFrontToApiGatewayToLambda = deployNewFunc(stack); - expect(construct.cloudFrontWebDistribution !== null); - expect(construct.apiGateway !== null); - expect(construct.lambdaFunction !== null); - expect(construct.cloudFrontFunction !== null); - expect(construct.cloudFrontLoggingBucket !== null); - expect(construct.apiGatewayCloudWatchRole !== null); - expect(construct.apiGatewayLogGroup !== null); + expect(construct.cloudFrontWebDistribution).toBeDefined(); + expect(construct.apiGateway).toBeDefined(); + expect(construct.lambdaFunction).toBeDefined(); + expect(construct.cloudFrontFunction).toBeDefined(); + expect(construct.cloudFrontLoggingBucket).toBeDefined(); + expect(construct.apiGatewayCloudWatchRole).toBeDefined(); + expect(construct.apiGatewayLogGroup).toBeDefined(); }); test('check lambda function properties for deploy: true', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts index 4d19561a9..c78c782ab 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/test.cloudfront-apigateway.test.ts @@ -40,10 +40,10 @@ test('check getter methods', () => { const construct: CloudFrontToApiGateway = deploy(stack); - expect(construct.cloudFrontWebDistribution !== null); - expect(construct.apiGateway !== null); - expect(construct.cloudFrontFunction !== null); - expect(construct.cloudFrontLoggingBucket !== null); + expect(construct.cloudFrontWebDistribution).toBeDefined(); + expect(construct.apiGateway).toBeDefined(); + expect(construct.cloudFrontFunction).toBeDefined(); + expect(construct.cloudFrontLoggingBucket).toBeDefined(); }); test('test cloudfront DomainName', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts index f7c0090d0..156986af7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts @@ -143,8 +143,8 @@ test('check properties', () => { const construct: CloudFrontToS3 = deploy(stack); - expect(construct.cloudFrontWebDistribution !== null); - expect(construct.s3Bucket !== null); + expect(construct.cloudFrontWebDistribution).toBeDefined(); + expect(construct.s3Bucket).toBeDefined(); }); test("Confirm CheckS3Props is called", () => { @@ -173,7 +173,7 @@ test("Test existingBucketObj", () => { existingBucketObj: s3.Bucket.fromBucketName(stack, 'mybucket', 'mybucket') }); // Assertion - expect(construct.cloudFrontWebDistribution !== null); + expect(construct.cloudFrontWebDistribution).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::CloudFront::Distribution", { DistributionConfig: { diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts index ef337275c..1628f0026 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/test.cognito-apigateway-lambda.test.ts @@ -89,13 +89,13 @@ test('check properties', () => { const construct: CognitoToApiGatewayToLambda = deployNewFunc(stack); - expect(construct.userPool !== null); - expect(construct.userPoolClient !== null); - expect(construct.apiGateway !== null); - expect(construct.lambdaFunction !== null); - expect(construct.apiGatewayCloudWatchRole !== null); - expect(construct.apiGatewayLogGroup !== null); - expect(construct.apiGatewayAuthorizer !== null); + expect(construct.userPool).toBeDefined(); + expect(construct.userPoolClient).toBeDefined(); + expect(construct.apiGateway).toBeDefined(); + expect(construct.lambdaFunction).toBeDefined(); + expect(construct.apiGatewayCloudWatchRole).toBeDefined(); + expect(construct.apiGatewayLogGroup).toBeDefined(); + expect(construct.apiGatewayAuthorizer).toBeDefined(); }); test('override cognito cognitoUserPoolClientProps', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts index 4edab1fce..d273f24f0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/dynamodbstreams-lambda-elasticsearch-kibana.test.ts @@ -58,14 +58,14 @@ test('check properties', () => { const construct: DynamoDBStreamsToLambdaToElasticSearchAndKibana = deployNewFunc(stack); - expect(construct.lambdaFunction !== null); - expect(construct.dynamoTable !== null); - expect(construct.elasticsearchDomain !== null); - expect(construct.elasticsearchRole !== null); - expect(construct.identityPool !== null); - expect(construct.userPool !== null); - expect(construct.userPoolClient !== null); - expect(construct.cloudwatchAlarms !== null); + expect(construct.lambdaFunction).toBeDefined(); + expect(construct.dynamoTable).toBeDefined(); + expect(construct.elasticsearchDomain).toBeDefined(); + expect(construct.elasticsearchRole).toBeDefined(); + expect(construct.identityPool).toBeDefined(); + expect(construct.userPool).toBeDefined(); + expect(construct.userPoolClient).toBeDefined(); + expect(construct.cloudwatchAlarms).toBeDefined(); }); test('check exception for Missing existingObj from props for deploy = false', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts index 46340caa7..908783b5c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/eventbridge-kinesisfirehose-s3.test.ts @@ -33,13 +33,13 @@ test('Test properties', () => { const construct: EventbridgeToKinesisFirehoseToS3 = deployNewStack(stack); // Assertions - expect(construct.eventsRule !== null); - expect(construct.eventsRole !== null); - expect(construct.kinesisFirehose !== null); - expect(construct.kinesisFirehoseRole !== null); - expect(construct.kinesisFirehoseLogGroup !== null); - expect(construct.s3Bucket !== null); - expect(construct.s3LoggingBucket !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.eventsRole).toBeDefined(); + expect(construct.kinesisFirehose).toBeDefined(); + expect(construct.kinesisFirehoseRole).toBeDefined(); + expect(construct.kinesisFirehoseLogGroup).toBeDefined(); + expect(construct.s3Bucket).toBeDefined(); + expect(construct.s3LoggingBucket).toBeDefined(); }); test('Test default server side s3 bucket encryption', () => { @@ -144,14 +144,14 @@ test('check eventbus property, snapshot & eventbus exists', () => { }; const construct = new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-kinesis-firehose-default-parameters', props); - expect(construct.eventsRule !== null); - expect(construct.eventsRole !== null); - expect(construct.kinesisFirehose !== null); - expect(construct.kinesisFirehoseRole !== null); - expect(construct.kinesisFirehoseLogGroup !== null); - expect(construct.s3Bucket !== null); - expect(construct.s3LoggingBucket !== null); - expect(construct.eventBus !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.eventsRole).toBeDefined(); + expect(construct.kinesisFirehose).toBeDefined(); + expect(construct.kinesisFirehoseRole).toBeDefined(); + expect(construct.kinesisFirehoseLogGroup).toBeDefined(); + expect(construct.s3Bucket).toBeDefined(); + expect(construct.s3LoggingBucket).toBeDefined(); + expect(construct.eventBus).toBeDefined(); // Check whether eventbus exists const template = Template.fromStack(stack); template.resourceCountIs('AWS::Events::EventBus', 1); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/eventbridge-kinesisstreams.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/eventbridge-kinesisstreams.test.ts index db67a11dc..475f78045 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/eventbridge-kinesisstreams.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/eventbridge-kinesisstreams.test.ts @@ -32,9 +32,9 @@ test('Test properties', () => { const construct: EventbridgeToKinesisStreams = deployNewStack(stack); // Assertions - expect(construct.eventsRule !== null); - expect(construct.kinesisStream !== null); - expect(construct.eventsRole !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.kinesisStream).toBeDefined(); + expect(construct.eventsRole).toBeDefined(); }); test('Test default AWS managed encryption key property', () => { @@ -91,10 +91,10 @@ test('check eventbus property, snapshot & eventbus exists', () => { }; const construct = new EventbridgeToKinesisStreams(stack, 'test-eventbridge-kinesis-streams-default-parameters', props); - expect(construct.eventsRule !== null); - expect(construct.kinesisStream !== null); - expect(construct.eventsRole !== null); - expect(construct.eventBus !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.kinesisStream).toBeDefined(); + expect(construct.eventsRole).toBeDefined(); + expect(construct.eventBus).toBeDefined(); // Check whether eventbus exists const template = Template.fromStack(stack); template.resourceCountIs('AWS::Events::EventBus', 1); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts index ecda59f25..d9699e8fc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/eventbridge-lambda.test.ts @@ -184,8 +184,8 @@ test('check properties', () => { const construct: EventbridgeToLambda = deployNewFunc(stack); - expect(construct.eventsRule !== null); - expect(construct.lambdaFunction !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.lambdaFunction).toBeDefined(); }); test('check exception for Missing existingObj from props', () => { @@ -209,9 +209,9 @@ test('check eventbus property, snapshot & eventbus exists', () => { const construct: EventbridgeToLambda = deployNewEventBus(stack); - expect(construct.eventsRule !== null); - expect(construct.lambdaFunction !== null); - expect(construct.eventBus !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.lambdaFunction).toBeDefined(); + expect(construct.eventBus).toBeDefined(); // Check whether eventbus exists const template = Template.fromStack(stack); template.resourceCountIs('AWS::Events::EventBus', 1); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts index 7d3c800f5..7e967141a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts @@ -169,9 +169,9 @@ test('check properties', () => { const stack = new cdk.Stack(); const construct: EventbridgeToSns = deployNewStack(stack); - expect(construct.eventsRule !== null); - expect(construct.snsTopic !== null); - expect(construct.encryptionKey !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.snsTopic).toBeDefined(); + expect(construct.encryptionKey).toBeDefined(); }); test('check the sns topic properties', () => { @@ -224,10 +224,10 @@ test('check eventbus property, snapshot & eventbus exists', () => { const construct: EventbridgeToSns = deployStackWithNewEventBus(stack); - expect(construct.eventsRule !== null); - expect(construct.snsTopic !== null); - expect(construct.encryptionKey !== null); - expect(construct.eventBus !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.snsTopic).toBeDefined(); + expect(construct.encryptionKey).toBeDefined(); + expect(construct.eventBus).toBeDefined(); // Check whether eventbus exists const template = Template.fromStack(stack); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts index 34836f8cc..f8a7a79cc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-sqs-queue.test.ts @@ -278,21 +278,21 @@ test('check properties', () => { const stack = new cdk.Stack(); const construct: EventbridgeToSqs = deployNewStack(stack); - expect(construct.eventsRule !== null); - expect(construct.sqsQueue !== null); - expect(construct.encryptionKey !== null); - expect(construct.deadLetterQueue !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.sqsQueue).toBeDefined(); + expect(construct.encryptionKey).toBeDefined(); + expect(construct.deadLetterQueue).toBeDefined(); }); test('check eventbus property, snapshot & eventbus exists', () => { const stack = new cdk.Stack(); const construct: EventbridgeToSqs = deployStackWithNewEventBus(stack); - expect(construct.eventsRule !== null); - expect(construct.sqsQueue !== null); - expect(construct.encryptionKey !== null); - expect(construct.deadLetterQueue !== null); - expect(construct.eventBus !== null); + expect(construct.eventsRule).toBeDefined(); + expect(construct.sqsQueue).toBeDefined(); + expect(construct.encryptionKey).toBeDefined(); + expect(construct.deadLetterQueue).toBeDefined(); + expect(construct.eventBus).toBeDefined(); // Check whether eventbus exists const template = Template.fromStack(stack); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts index 0138bde2b..2ef7c76d0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/eventbridge-stepfunctions.test.ts @@ -106,10 +106,10 @@ test('check properties', () => { const construct: EventbridgeToStepfunctions = deployNewStateMachine(stack); - expect(construct.cloudwatchAlarms !== null); - expect(construct.stateMachine !== null); - expect(construct.eventsRule !== null); - expect(construct.stateMachineLogGroup !== null); + expect(construct.cloudwatchAlarms).toBeDefined(); + expect(construct.stateMachine).toBeDefined(); + expect(construct.eventsRule).toBeDefined(); + expect(construct.stateMachineLogGroup).toBeDefined(); }); test('check properties with no CW Alarms', () => { @@ -128,10 +128,10 @@ test('check properties with no CW Alarms', () => { const construct: EventbridgeToStepfunctions = new EventbridgeToStepfunctions(stack, 'test-eventbridge-stepfunctions', props); - expect(construct.cloudwatchAlarms === null); - expect(construct.stateMachine !== null); - expect(construct.eventsRule !== null); - expect(construct.stateMachineLogGroup !== null); + expect(construct.cloudwatchAlarms).not.toBeDefined(); + expect(construct.stateMachine).toBeDefined(); + expect(construct.eventsRule).toBeDefined(); + expect(construct.stateMachineLogGroup).toBeDefined(); }); test('check eventbus property, snapshot & eventbus exists', () => { @@ -139,11 +139,11 @@ test('check eventbus property, snapshot & eventbus exists', () => { const construct: EventbridgeToStepfunctions = deployNewStateMachineAndEventBus(stack); - expect(construct.cloudwatchAlarms !== null); - expect(construct.stateMachine !== null); - expect(construct.eventsRule !== null); - expect(construct.stateMachineLogGroup !== null); - expect(construct.eventBus !== null); + expect(construct.cloudwatchAlarms).toBeDefined(); + expect(construct.stateMachine).toBeDefined(); + expect(construct.eventsRule).toBeDefined(); + expect(construct.stateMachineLogGroup).toBeDefined(); + expect(construct.eventBus).toBeDefined(); // Check whether eventbus exists const template = Template.fromStack(stack); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts index 23c011611..6a89c20b1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/fargate-dynamodb.test.ts @@ -46,11 +46,11 @@ test('New service/new table, public API, new VPC', () => { tablePermissions: 'ReadWrite' }); - expect(construct.vpc !== null); - expect(construct.service !== null); - expect(construct.container !== null); - expect(construct.dynamoTable !== null); - expect(construct.dynamoTableInterface !== null); + expect(construct.vpc).toBeDefined(); + expect(construct.service).toBeDefined(); + expect(construct.container).toBeDefined(); + expect(construct.dynamoTable).toBeDefined(); + expect(construct.dynamoTableInterface).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::ECS::Service", { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts index 7ea1a788d..274d9fb6c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/aws-fargate-kinesisfirehose.test.ts @@ -39,10 +39,10 @@ test('New service/new bucket, public API, new VPC', () => { existingKinesisFirehose: destination.kinesisFirehose }); - expect(construct.vpc !== null); - expect(construct.service !== null); - expect(construct.container !== null); - expect(construct.kinesisFirehose !== null); + expect(construct.vpc).toBeDefined(); + expect(construct.service).toBeDefined(); + expect(construct.container).toBeDefined(); + expect(construct.kinesisFirehose).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::ECS::Service", { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts index c12f81c9c..e7d7aea5e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/fargate-opensearch.test.ts @@ -71,15 +71,15 @@ test('Check construct properties', () => { const construct = deployStackWithNewResources(stack, publicApi); - expect(construct.vpc !== null); - expect(construct.service !== null); - expect(construct.container !== null); - expect(construct.userPool !== null); - expect(construct.userPoolClient !== null); - expect(construct.identityPool !== null); - expect(construct.openSearchDomain !== null); - expect(construct.openSearchRole !== null); - expect(construct.cloudWatchAlarms !== null); + expect(construct.vpc).toBeDefined(); + expect(construct.service).toBeDefined(); + expect(construct.container).toBeDefined(); + expect(construct.userPool).toBeDefined(); + expect(construct.userPoolClient).toBeDefined(); + expect(construct.identityPool).toBeDefined(); + expect(construct.openSearchDomain).toBeDefined(); + expect(construct.openSearchRole).toBeDefined(); + expect(construct.cloudWatchAlarms).toBeDefined(); }); test('Test cognito dashboard role IAM policy', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts index f4d3d4bdc..e82eaafb3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/fargate-s3.test.ts @@ -42,11 +42,11 @@ test('New service/new bucket, public API, new VPC', () => { bucketPermissions: ['Delete', 'Read', 'Write'] }); - expect(construct.vpc !== null); - expect(construct.service !== null); - expect(construct.container !== null); - expect(construct.s3Bucket !== null); - expect(construct.s3BucketInterface !== null); + expect(construct.vpc).toBeDefined(); + expect(construct.service).toBeDefined(); + expect(construct.container).toBeDefined(); + expect(construct.s3Bucket).toBeDefined(); + expect(construct.s3BucketInterface).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::ECS::Service", { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts index 4b5daa9f7..1cb79f5d5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/fargate-secretsmanager.test.ts @@ -45,10 +45,10 @@ test('New service/new secret, public API, new VPC', () => { }, }); - expect(construct.vpc !== null); - expect(construct.service !== null); - expect(construct.container !== null); - expect(construct.secret !== null); + expect(construct.vpc).toBeDefined(); + expect(construct.service).toBeDefined(); + expect(construct.container).toBeDefined(); + expect(construct.secret).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::ECS::Service", { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts index 131728377..caa8f921c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/fargate-sqs.test.ts @@ -58,11 +58,11 @@ test('New service/new queue, dlq, public API, new VPC', () => { PlatformVersion: ecs.FargatePlatformVersion.LATEST, }); - expect(construct.vpc !== null); - expect(construct.service !== null); - expect(construct.container !== null); - expect(construct.sqsQueue !== null); - expect(construct.deadLetterQueue !== null); + expect(construct.vpc).toBeDefined(); + expect(construct.service).toBeDefined(); + expect(construct.container).toBeDefined(); + expect(construct.sqsQueue).toBeDefined(); + expect(construct.deadLetterQueue).toBeDefined(); template.hasResourceProperties("AWS::ECS::Service", { ServiceName: serviceName diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts index 283ee5be6..55fbb5dcc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/fargate-ssmstringparameter.test.ts @@ -47,10 +47,10 @@ test('New service/new parameter store, public API, new VPC', () => { }, }); - expect(construct.vpc !== null); - expect(construct.service !== null); - expect(construct.container !== null); - expect(construct.stringParameter !== null); + expect(construct.vpc).toBeDefined(); + expect(construct.service).toBeDefined(); + expect(construct.container).toBeDefined(); + expect(construct.stringParameter).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::ECS::Service", { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts index e74600402..b8f6352e4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/test.iot-kinesisfirehose-s3.test.ts @@ -120,13 +120,13 @@ test('check properties', () => { const construct: IotToKinesisFirehoseToS3 = deploy(stack); - expect(construct.iotTopicRule !== null); - expect(construct.kinesisFirehose !== null); - expect(construct.s3Bucket !== null); - expect(construct.iotActionsRole !== null); - expect(construct.kinesisFirehoseRole !== null); - expect(construct.kinesisFirehoseLogGroup !== null); - expect(construct.s3LoggingBucket !== null); + expect(construct.iotTopicRule).toBeDefined(); + expect(construct.kinesisFirehose).toBeDefined(); + expect(construct.s3Bucket).toBeDefined(); + expect(construct.iotActionsRole).toBeDefined(); + expect(construct.kinesisFirehoseRole).toBeDefined(); + expect(construct.kinesisFirehoseLogGroup).toBeDefined(); + expect(construct.s3LoggingBucket).toBeDefined(); }); test("Confirm CheckS3Props is being called", () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts index 64763d28a..05a6e84c6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/iot-lambda.test.ts @@ -271,8 +271,8 @@ test('check properties', () => { const construct: IotToLambda = deployNewFunc(stack); - expect(construct.iotTopicRule !== null); - expect(construct.lambdaFunction !== null); + expect(construct.iotTopicRule).toBeDefined(); + expect(construct.lambdaFunction).toBeDefined(); }); test('check exception for Missing existingObj from props for deploy = false', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts index ac5449520..89adcdd84 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts @@ -47,12 +47,12 @@ test('Test properties', () => { }; const app = new KinesisFirehoseToAnalyticsAndS3(stack, 'test-kinesis-firehose-kinesis-analytics', props); // Assertions - expect(app.kinesisAnalytics !== null); - expect(app.kinesisFirehose !== null); - expect(app.kinesisFirehoseRole !== null); - expect(app.kinesisFirehoseLogGroup !== null); - expect(app.s3Bucket !== null); - expect(app.s3LoggingBucket !== null); + expect(app.kinesisAnalytics).toBeDefined(); + expect(app.kinesisFirehose).toBeDefined(); + expect(app.kinesisFirehoseRole).toBeDefined(); + expect(app.kinesisFirehoseLogGroup).toBeDefined(); + expect(app.s3Bucket).toBeDefined(); + expect(app.s3LoggingBucket).toBeDefined(); }); // -------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts index 16d4ac1d9..1d6cfe0c4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/kinesisstreams-lambda.test.ts @@ -30,11 +30,11 @@ test('Test properties', () => { }; const app = new KinesisStreamsToLambda(stack, 'test-kinesis-streams-lambda', props); // Assertion 1 - expect(app.lambdaFunction !== null); + expect(app.lambdaFunction).toBeDefined(); // Assertion 2 - expect(app.kinesisStream !== null); + expect(app.kinesisStream).toBeDefined(); // Assertion 3 - expect(app.cloudwatchAlarms !== null); + expect(app.cloudwatchAlarms).toBeDefined(); }); test('Test existing resources', () => { @@ -108,11 +108,11 @@ test('Test properties with no CW Alarms', () => { }; const app = new KinesisStreamsToLambda(stack, 'test-kinesis-streams-lambda', props); // Assertion 1 - expect(app.lambdaFunction !== null); + expect(app.lambdaFunction).toBeDefined(); // Assertion 2 - expect(app.kinesisStream !== null); + expect(app.kinesisStream).toBeDefined(); // Assertion 3 - expect(app.cloudwatchAlarms === null); + expect(app.cloudwatchAlarms).not.toBeDefined(); }); test('Confirm call to CheckLambdaProps', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts index ea3392b25..5051a0fda 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/lambda-dynamodb.test.ts @@ -275,8 +275,8 @@ test('check properties', () => { const construct: LambdaToDynamoDB = deployNewFunc(stack); - expect(construct.lambdaFunction !== null); - expect(construct.dynamoTable !== null); + expect(construct.lambdaFunction).toBeDefined(); + expect(construct.dynamoTable).toBeDefined(); }); test('check exception for Missing existingObj from props', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts index 5efbb891f..6a585408f 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/aws-lambda-kinesisfirehose.test.ts @@ -108,7 +108,7 @@ test('Test that new VPC is created', () => { } }); - expect(construct.vpc !== null); + expect(construct.vpc).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::EC2::VPC", { @@ -148,7 +148,7 @@ test('Test that existing VPC is used', () => { existingVpc: myVpc }); - expect(construct.vpc !== null); + expect(construct.vpc).toBeDefined(); // Make sure we didn't deploy a new one anyway const template = Template.fromStack(stack); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts index 400ba7b44..031ce1242 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/lambda-s3.test.ts @@ -34,11 +34,11 @@ test('Test the properties', () => { }); // Assertion 1 const func = pattern.lambdaFunction; - expect(func !== null); + expect(func).toBeDefined(); // Assertion 2 const bucket = pattern.s3Bucket; - expect(bucket !== null); - expect(pattern.s3LoggingBucket !== null); + expect(bucket).toBeDefined(); + expect(pattern.s3LoggingBucket).toBeDefined(); }); test('Test the bucketProps override', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts index 31191b050..e8c707bb1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/s3-lambda.test.ts @@ -38,9 +38,9 @@ test('check properties', () => { const construct: S3ToLambda = deployNewFunc(stack); - expect(construct.lambdaFunction !== null); - expect(construct.s3Bucket !== null); - expect(construct.s3LoggingBucket !== null); + expect(construct.lambdaFunction).toBeDefined(); + expect(construct.s3Bucket).toBeDefined(); + expect(construct.s3LoggingBucket).toBeDefined(); }); test("Confirm CheckS3Props is being called", () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts index b1bbaa8f5..13acbc083 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/test.s3-sns.test.ts @@ -24,11 +24,11 @@ test('All get methods return non-null objects', () => { const app = new S3ToSns(stack, 'test-s3-sns', { }); - expect(app.snsTopic !== null); - expect(app.s3Bucket !== null); - expect(app.s3LoggingBucket !== null); - expect(app.encryptionKey !== null); - expect(app.s3BucketInterface !== null); + expect(app.snsTopic).toBeDefined(); + expect(app.s3Bucket).toBeDefined(); + expect(app.s3LoggingBucket).toBeDefined(); + expect(app.encryptionKey).toBeDefined(); + expect(app.s3BucketInterface).toBeDefined(); }); test('construct creates default event notification', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts index f9a423590..3536ea314 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts @@ -33,11 +33,11 @@ test('Test getter methods', () => { }; const app = new S3ToSqs(stack, 'test-s3-sqs', props); // Assertion 1 - expect(app.sqsQueue !== null); + expect(app.sqsQueue).toBeDefined(); // Assertion 2 - expect(app.deadLetterQueue !== null); + expect(app.deadLetterQueue).toBeDefined(); // Assertion 3 - expect(app.s3Bucket !== null); + expect(app.s3Bucket).toBeDefined(); }); test('Test deployment w/ existing queue', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts index 6c5486295..8a09b0be8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/s3-stepfunctions.test.ts @@ -98,11 +98,11 @@ test('check properties', () => { const construct: S3ToStepfunctions = deployNewStateMachine(stack); - expect(construct.stateMachine !== null); - expect(construct.s3Bucket !== null); - expect(construct.cloudwatchAlarms !== null); - expect(construct.stateMachineLogGroup !== null); - expect(construct.s3LoggingBucket !== null); + expect(construct.stateMachine).toBeDefined(); + expect(construct.s3Bucket).toBeDefined(); + expect(construct.cloudwatchAlarms).toBeDefined(); + expect(construct.stateMachineLogGroup).toBeDefined(); + expect(construct.s3LoggingBucket).toBeDefined(); }); // -------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts index 96aa19afb..ee8ba5c7c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/sns-lambda.test.ts @@ -35,8 +35,8 @@ test('check properties', () => { const construct: SnsToLambda = deployNewFunc(stack); - expect(construct.lambdaFunction !== null); - expect(construct.snsTopic !== null); + expect(construct.lambdaFunction).toBeDefined(); + expect(construct.snsTopic).toBeDefined(); }); test('override topicProps', () => { diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts index eb246cffc..320fac669 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/sns-sqs.test.ts @@ -112,13 +112,13 @@ test('Test getter methods', () => { }; const app = new SnsToSqs(stack, 'test-sns-sqs', props); // Assertion 1 - expect(app.snsTopic !== null); + expect(app.snsTopic).toBeDefined(); // Assertion 2 - expect(app.encryptionKey !== null); + expect(app.encryptionKey).toBeDefined(); // Assertion 3 - expect(app.sqsQueue !== null); + expect(app.sqsQueue).toBeDefined(); // Assertion 4 - expect(app.deadLetterQueue !== null); + expect(app.deadLetterQueue).toBeDefined(); }); test('Test deployment w/ existing queue, and topic', () => { @@ -136,7 +136,7 @@ test('Test deployment w/ existing queue, and topic', () => { existingQueueObj: queue }); // Assertion 2 - expect(app.snsTopic !== null); + expect(app.snsTopic).toBeDefined(); // Assertion 3 const template = Template.fromStack(stack); template.hasResourceProperties("AWS::SNS::Topic", { diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts index e7ae16a1c..20f88fe91 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/test.sqs-lambda.test.ts @@ -67,11 +67,11 @@ test('Test getter methods', () => { }; const app = new SqsToLambda(stack, 'sqs-lambda', props); // Assertion 1 - expect(app.lambdaFunction !== null); + expect(app.lambdaFunction).toBeDefined(); // Assertion 2 - expect(app.sqsQueue !== null); + expect(app.sqsQueue).toBeDefined(); // Assertion 3 - expect(app.deadLetterQueue !== null); + expect(app.deadLetterQueue).toBeDefined(); }); // -------------------------------------------------------------- diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/test.wafwebacl-alb.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/test.wafwebacl-alb.test.ts index be7a1dadc..0c9c51a35 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/test.wafwebacl-alb.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/test.wafwebacl-alb.test.ts @@ -71,8 +71,8 @@ test('Test default deployment', () => { const stack = new cdk.Stack(); const construct = deployConstruct(stack); - expect(construct.webacl !== null); - expect(construct.loadBalancer !== null); + expect(construct.webacl).toBeDefined(); + expect(construct.loadBalancer).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::WAFv2::WebACL", { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts index c1941167e..45b066425 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/test.wafwebacl-apigateway.test.ts @@ -60,8 +60,8 @@ test('Test default deployment', () => { const stack = new cdk.Stack(); const construct = deployConstruct(stack); - expect(construct.webacl !== null); - expect(construct.apiGateway !== null); + expect(construct.webacl).toBeDefined(); + expect(construct.apiGateway).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::WAFv2::WebACL", { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts index bc5826048..02cf0ac92 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/test.wafwebacl-appsync.test.ts @@ -73,8 +73,8 @@ test("Test default deployment", () => { const stack = new cdk.Stack(); const construct = deployConstruct(stack); - expect(construct.webacl !== null); - expect(construct.appsyncApi !== null); + expect(construct.webacl).toBeDefined(); + expect(construct.appsyncApi).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::WAFv2::WebACL", { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts index 974c8ad18..3ec3b72f3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/test.wafwebacl-cloudfront.test.ts @@ -70,8 +70,8 @@ test('Test default deployment', () => { const stack = new cdk.Stack(); const construct = deployConstruct(stack); - expect(construct.webacl !== null); - expect(construct.cloudFrontWebDistribution !== null); + expect(construct.webacl).toBeDefined(); + expect(construct.cloudFrontWebDistribution).toBeDefined(); const template = Template.fromStack(stack); template.hasResourceProperties("AWS::WAFv2::WebACL", { From 8f76f0c5a1143010f566aaf5f19424d2196b11c9 Mon Sep 17 00:00:00 2001 From: Ryan Hayes Date: Wed, 11 Oct 2023 14:31:58 -0400 Subject: [PATCH 55/73] Minor syntax adjustments for select README files (#1018) * docs: syntax changes for doc generator * chore: re-apply copyright banner at bottom of construct page --- .../aws-eventbridge-kinesisfirehose-s3/README.md | 3 ++- .../@aws-solutions-constructs/aws-lambda-kendra/README.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/README.md b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/README.md index feef1a2c2..b0ab28d7c 100755 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/README.md @@ -87,7 +87,8 @@ new EventbridgeToKinesisFirehoseToS3(this, "test-eventbridge-firehose-s3", |loggingBucketProps?|[`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html)|Optional user provided props to override the default props for the S3 Logging Bucket.| |logS3AccessLogs?| boolean|Whether to turn on Access Logging for the S3 bucket. Creates an S3 bucket with associated storage costs for the logs. Enabling Access Logging is a best practice. default - true| -NOTE: `existingLoggingBucketObj` has been deprecated - to specify an existing Log Bucket, use bucketProps.serverAccessLogsBucket +NOTE: `existingLoggingBucketObj` has been deprecated - to specify an existing Log Bucket, use `bucketProps.serverAccessLogsBucket`. + ## Pattern Properties | **Name** | **Type** | **Description** | diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md index 08113c5a3..03992a347 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/README.md @@ -78,7 +78,7 @@ TBD | existingKendraIndexObj? | [`kendra.cfnIndex`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kendra.CfnIndex.html) | An existing Kendra index to which the Lambda function will be granted access. Supplying along with kendraIndexProps or kendraDataSourceProps will throw an error. | | existingVpc? | [`ec2.IVpc`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.IVpc.html) | An optional, existing VPC into which this pattern should be deployed. When deployed in a VPC, the Lambda function will use ENIs in the VPC to access network resources. If an existing VPC is provided, the `deployVpc` property cannot be `true`. This uses `ec2.IVpc` to allow clients to supply VPCs that exist outside the stack using the [`ec2.Vpc.fromLookup()`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#static-fromwbrlookupscope-id-options) method. | | vpcProps? | [`ec2.VpcProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.VpcProps.html) | Optional user provided properties to override the default properties for the new VPC. `enableDnsHostnames`, `enableDnsSupport`, `natGateways` and `subnetConfiguration` are set by the pattern, so any values for those properties supplied here will be overridden. If `deployVpc` is not `true` then this property will be ignored. | -| deployVpc? | `boolean` | Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to true will deploy the minimal, most private VPC to run the pattern:
\- One isolated subnet in each Availability Zone used by the CDK program
\- `enableDnsHostnames` and `enableDnsSupport` will both be set to true
If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`. | +| deployVpc? | `boolean` | Whether to create a new VPC based on `vpcProps` into which to deploy this pattern. Setting this to `true` will deploy the minimal, most private VPC to run the pattern, consisting of (1) one isolated subnet in each Availability Zone used by the CDK program; and (2) `enableDnsHostnames` and `enableDnsSupport` both being set to `true`. If this property is `true` then `existingVpc` cannot be specified. Defaults to `false`. | ## Pattern Properties From e94cd5a0c41a0ac87945b24efbe76bc0e8c3bd9d Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Fri, 13 Oct 2023 17:20:09 -0400 Subject: [PATCH 56/73] chore(all): perform updates required to move to latest cdk version (#1019) * Fix stray version number * First round of updates * Lock in cdk-integ upgrade (avoid revert) * Update integration snapshots --- deployment/v2/align-version.js | 2 +- ...eg.all-existing-private-http.expected.json | 246 +++++------ .../integ.all-new-public-http.expected.json | 250 +++++------ .../integ.all-new-two-targets.expected.json | 254 +++++------ ....privateApiExistingResources.expected.json | 196 ++++----- ...integ.privateApiNewResources.expected.json | 88 ++-- ...g.publicApiExistingResources.expected.json | 196 ++++----- .../integ.publicApiNewResources.expected.json | 196 ++++----- .../test/integ.twoTargets.expected.json | 212 +++++----- ...ustomCloudfrontLoggingBucket.expected.json | 107 +---- .../test/integ.no-arguments.expected.json | 107 +---- .../integ.override-behavior.expected.json | 107 +---- ...ustomCloudfrontLoggingBucket.expected.json | 107 +---- .../test/integ.no-arguments.expected.json | 107 +---- ...ustomCloudFrontLoggingBucket.expected.json | 107 +---- .../test/integ.default.expected.json | 107 +---- .../integ.existingContainer.expected.json | 107 +---- .../integ.overrideProperties.expected.json | 107 +---- ...g.withoutHttpSecurityHeaders.expected.json | 107 +---- .../integ.custom-originPath.expected.json | 107 +---- ...nteg.custom-security-headers.expected.json | 107 +---- ...ustomCloudFrontLoggingBucket.expected.json | 107 +---- .../integ.customLoggingBucket.expected.json | 107 +---- .../test/integ.existing-bucket.expected.json | 107 +---- .../test/integ.no-arguments.expected.json | 107 +---- .../integ.no-security-headers.expected.json | 107 +---- .../test/integ.no-arguments.expected.json | 78 ++-- .../test/integ.deploy-with-vpc.expected.json | 116 ++--- .../test/integ.no-arguments.expected.json | 54 +-- .../integ.existingLoggingBucket.expected.json | 107 +---- ...ventbridge-existing-eventbus.expected.json | 14 +- .../integ.eventbridge-existing-eventbus.ts | 2 +- ...teg.eventbridge-new-eventbus.expected.json | 18 +- .../test/integ.eventbridge-new-eventbus.ts | 2 +- ...nteg.eventbridge-no-argument.expected.json | 12 +- ...pfunctions-existing-eventbus.expected.json | 46 +- ...tbridge-stepfunctions-existing-eventbus.ts | 2 +- ...e-stepfunctions-new-eventbus.expected.json | 50 ++- ....eventbridge-stepfunctions-new-eventbus.ts | 2 +- ...ge-stepfunctions-no-argument.expected.json | 30 +- ...ge-stepfunctions-with-lambda.expected.json | 44 +- .../integ.existing-resources.expected.json | 263 ++++++------ .../test/integ.new-resources.expected.json | 279 ++++++------ .../integ.existing-resources.expected.json | 247 +++++------ .../test/integ.new-resources.expected.json | 247 +++++------ ...integ.existingFargateService.expected.json | 390 +++++++---------- .../test/integ.existingVpc.expected.json | 398 +++++++----------- ...nteg.fargateServiceFromProps.expected.json | 398 +++++++----------- .../test/integ.noArguments.expected.json | 249 +++++------ .../test/integ.vpcFromprops.expected.json | 398 +++++++----------- ...integ.existingFargateService.expected.json | 285 +++++++------ .../test/integ.existingStream.expected.json | 295 ++++++------- .../test/integ.existingVpc.expected.json | 295 ++++++------- ...nteg.fargateServiceFromProps.expected.json | 295 ++++++------- .../test/integ.noArguments.expected.json | 295 ++++++------- .../test/integ.streamFromProps.expected.json | 295 ++++++------- .../test/integ.vpcFromProps.expected.json | 295 ++++++------- .../integ.existing-resources.expected.json | 258 ++++++------ .../test/integ.new-resources.expected.json | 258 ++++++------ .../integ.existing-resources.expected.json | 239 ++++++----- .../test/integ.new-resources.expected.json | 239 ++++++----- .../integ.existing-resources.expected.json | 247 +++++------ .../test/integ.new-resources.expected.json | 247 +++++------ .../integ.existing-resources.expected.json | 249 +++++------ .../test/integ.new-resources.expected.json | 247 +++++------ .../integ.existing-resources.expected.json | 247 +++++------ .../test/integ.new-resources.expected.json | 247 +++++------ .../integ.existing-resources.expected.json | 253 +++++------ .../test/integ.new-resources.expected.json | 251 +++++------ .../test/integ.new-resources.expected.json | 267 ++++++------ .../integ.no-cloudwatch-alarms.expected.json | 255 +++++------ .../integ.iot-lambda-dynamodb.expected.json | 22 +- .../test/integ.with-vpc.expected.json | 110 ++--- .../integ.iot-lambda-new-func.expected.json | 12 +- ...iot-lambda-use-existing-func.expected.json | 12 +- ...integ.iot-s3-existing-bucket.expected.json | 109 +---- ....iot-s3-new-encrypted-bucket.expected.json | 4 +- .../integ.pre-existing-bucket.expected.json | 109 +---- ....pre-existing-logging-bucket.expected.json | 109 +---- .../test/integ.code-asset-job.expected.json | 18 +- .../test/integ.existing-job.expected.json | 4 +- .../test/integ.no-arguments.expected.json | 18 +- .../integ.customLoggingBucket.expected.json | 4 +- .../test/integ.existing-bucket.expected.json | 113 +---- ...nteg.existing-logging-bucket.expected.json | 113 +---- .../integ.existingStreamObj.expected.json | 22 +- .../test/integ.no-arguments.expected.json | 4 +- .../test/integ.existing.expected.json | 12 +- .../test/integ.no-arguments.expected.json | 22 +- .../integ.add-secondary-index.expected.json | 24 +- ...eployFunctionWithExistingVpc.expected.json | 228 +++++----- .../integ.deployFunctionWithVpc.expected.json | 114 ++--- .../test/integ.no-arguments.expected.json | 22 +- .../test/integ.set-billing-mode.expected.json | 20 +- .../integ.use-existing-func.expected.json | 22 +- .../integ.existingResources.expected.json | 90 ++-- .../test/integ.newResources.expected.json | 90 ++-- .../test/integ.withClientProps.expected.json | 90 ++-- ...loyFunctionWithClusterConfig.expected.json | 84 ++-- ...eployFunctionWithExistingVpc.expected.json | 208 ++++----- ...g.deployFunctionWithVpcProps.expected.json | 100 ++--- .../integ.deployToFiveZones.expected.json | 100 ++--- .../integ.disabledZoneAwareness.expected.json | 68 +-- .../test/integ.domain-arguments.expected.json | 38 +- .../test/integ.deployFunction.expected.json | 12 +- ...eployFunctionWithNewEventBus.expected.json | 104 ++--- .../integ.deployFunctionWithVpc.expected.json | 104 ++--- .../test/integ.existingEventBus.expected.json | 12 +- .../test/integ.existingFunction.expected.json | 12 +- .../aws-lambda-kendra/package.json | 4 +- .../integ.minimal-arguments.expected.json | 139 +----- .../test/integ.multiple-sources.expected.json | 157 ++----- .../test/integ.with-vpc.expected.json | 227 +++------- .../integ.existing-function.expected.json | 121 +----- .../test/integ.existing-vpc.expected.json | 317 +++++--------- .../test/integ.new-vpc.expected.json | 209 +++------ .../test/integ.no-arguments.expected.json | 121 +----- .../test/integ.existingLambda.expected.json | 16 +- .../test/integ.existingStream.expected.json | 16 +- .../integ.existingStreamWithCmk.expected.json | 20 +- .../test/integ.existingVpc.expected.json | 212 +++++----- .../integ.newStreamFromProps.expected.json | 16 +- .../test/integ.newVpc.expected.json | 104 ++--- .../test/integ.newVpcFromProps.expected.json | 72 ++-- .../test/integ.noArguments.expected.json | 16 +- .../test/integ.cluster-config.expected.json | 84 ++-- ...nteg.disabled-zone-awareness.expected.json | 68 +-- .../test/integ.domain-arguments.expected.json | 38 +- .../test/integ.existing-vpc.expected.json | 208 ++++----- .../test/integ.no-arguments.expected.json | 38 +- .../test/integ.vpc-props.expected.json | 100 ++--- .../integ.customLoggingBucket.expected.json | 12 +- .../test/integ.deployFunction.expected.json | 12 +- .../integ.deployFunctionWithVpc.expected.json | 100 ++--- .../test/integ.existingFunction.expected.json | 12 +- .../integ.pre-existing-bucket.expected.json | 121 +----- .../test/integ.deployFunction.expected.json | 24 +- .../test/integ.existingFunction.expected.json | 24 +- ...eg.existingSageMakerEndpoint.expected.json | 24 +- .../test/integ.deployFunction.expected.json | 12 +- ...eployFunctionWithExistingVpc.expected.json | 212 +++++----- .../integ.deployFunctionWithVpc.expected.json | 104 ++--- .../test/integ.existingFunction.expected.json | 12 +- .../test/integ.deployFunction.expected.json | 12 +- .../integ.deployFunctionWithVpc.expected.json | 104 ++--- .../test/integ.existingFunction.expected.json | 12 +- .../integ.defaultDeployment.expected.json | 30 +- ...eployProducerFunctionWithVpc.expected.json | 122 +++--- ...teg.existingConsumerFunction.expected.json | 30 +- ...teg.existingProducerFunction.expected.json | 30 +- .../test/integ.existingQueue.expected.json | 30 +- .../test/integ.deployFunction.expected.json | 12 +- .../integ.deployFunctionWithVpc.expected.json | 104 ++--- .../test/integ.existingFunction.expected.json | 12 +- .../test/integ.deployFunction.expected.json | 12 +- ...eployFunctionWithExistingVpc.expected.json | 212 +++++----- .../integ.deployFunctionWithVpc.expected.json | 104 ++--- .../test/integ.existingFunction.expected.json | 12 +- ...nteg.existingStringParameter.expected.json | 12 +- .../test/integ.deploy-lambda.expected.json | 42 +- .../integ.deployFunctionWithVpc.expected.json | 130 +++--- .../integ.existing-function.expected.json | 42 +- ...AssetExistingLambdaFunctions.expected.json | 38 +- ...iFromAssetNewLambdaFunctions.expected.json | 36 +- ....apiFromAssetWithCognitoAuth.expected.json | 36 +- .../test/integ.deployPrivateApi.expected.json | 78 ++-- ...deployPrivateApiExistingZone.expected.json | 186 ++++---- ...g.deployPublicApiExistingAlb.expected.json | 180 ++++---- .../integ.deployPublicApiNewAlb.expected.json | 186 ++++---- .../integ.deployWithoutLogging.expected.json | 72 ++-- .../integ.existing-s3-bucket.expected.json | 121 +----- .../test/integ.no-arguments.expected.json | 12 +- .../integ.customLoggingBucket.expected.json | 4 +- .../test/integ.existingS3Bucket.expected.json | 113 +---- .../test/integ.existingSnsTopic.expected.json | 4 +- .../integ.newTopicFromProps.expected.json | 4 +- .../test/integ.noArguments.expected.json | 4 +- ...integ.s3EventTypesAndFilters.expected.json | 4 +- .../test/integ.creatingNewQueue.expected.json | 4 +- .../integ.customLoggingBucket.expected.json | 4 +- .../integ.existingLoggingBucket.expected.json | 113 +---- .../test/integ.existingQueue.expected.json | 4 +- .../test/integ.existingS3Bucket.expected.json | 113 +---- .../test/integ.noArguments.expected.json | 4 +- .../integ.customLoggingBucket.expected.json | 30 +- .../integ.pre-existing-bucket.expected.json | 137 +----- ...s3-stepfunctions-no-argument.expected.json | 30 +- .../test/integ.no-arguments.expected.json | 20 +- .../test/integ.deployFifoQueue.expected.json | 18 +- .../test/integ.deployFunction.expected.json | 18 +- .../test/integ.existingFunction.expected.json | 18 +- .../test/integ.no-arguments.expected.json | 188 ++++----- ...ing-waf-to-multiple-gateways.expected.json | 106 ++--- .../test/integ.no-arguments.expected.json | 60 +-- .../integ.partial-arguments.expected.json | 60 +-- .../test/integ.no-arguments.expected.json | 14 +- .../integ.partial-arguments.expected.json | 14 +- ...g-waf-to-multiple-cloudfront.expected.json | 14 +- .../test/integ.no-arguments.expected.json | 14 +- .../integ.partial-arguments.expected.json | 14 +- ...g.template-writer-from-asset.expected.json | 18 +- ...late-writer-from-large-asset.expected.json | 20 +- source/tools/cdk-integ-tools/package.json | 6 +- 203 files changed, 8603 insertions(+), 12375 deletions(-) diff --git a/deployment/v2/align-version.js b/deployment/v2/align-version.js index 09d2f8e82..7650ba383 100755 --- a/deployment/v2/align-version.js +++ b/deployment/v2/align-version.js @@ -10,7 +10,7 @@ const findVersion = process.argv[2]; const replaceVersion = process.argv[3]; // these versions need to be sourced from a config file -const awsCdkLibVersion = '2.82.0'; +const awsCdkLibVersion = '2.99.1'; const constructsVersion = '10.0.0'; const MODULE_EXEMPTIONS = new Set([ '@aws-cdk/cloudformation-diff', diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json index f552779d8..db34b0132 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "all-existing-private-http/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-existing-private-http/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "all-existing-private-http/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-existing-private-http/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "all-existing-private-http/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-existing-private-http/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "all-existing-private-http/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-existing-private-http/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "all-existing-private-http/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-existing-private-http/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "all-existing-private-http/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-existing-private-http/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc" + "Value": "all-existing-private-http/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc" + "Value": "all-existing-private-http/Vpc/FlowLog" } ] }, @@ -647,10 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -661,10 +657,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc" + "Value": "all-existing-private-http/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -673,10 +673,6 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,7 +753,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "allexistingprivatehttpECRAPIsecuritygroupD77FBBD5": { @@ -972,7 +972,6 @@ "testsgfromallexistingprivatehttptestalbSecurityGroup4B36914B80803EB3A82F": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { - "IpProtocol": "tcp", "Description": "Load balancer to target", "FromPort": 8080, "GroupId": { @@ -981,6 +980,7 @@ "GroupId" ] }, + "IpProtocol": "tcp", "SourceSecurityGroupId": { "Fn::GetAtt": [ "testalbSecurityGroup0C84CDF9", @@ -997,6 +997,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1043,7 +1048,8 @@ } }, "DependsOn": [ - "testconstructtestconstructlistener484444F1" + "testconstructtestconstructlistener484444F1", + "testtaskdefTaskRoleB2DEF113" ] }, "testalb9AFCD824": { @@ -1135,13 +1141,6 @@ "testalbSecurityGrouptoallexistingprivatehttptestsgC280D41D8080C6A2C196": { "Type": "AWS::EC2::SecurityGroupEgress", "Properties": { - "GroupId": { - "Fn::GetAtt": [ - "testalbSecurityGroup0C84CDF9", - "GroupId" - ] - }, - "IpProtocol": "tcp", "Description": "Load balancer to target", "DestinationSecurityGroupId": { "Fn::GetAtt": [ @@ -1150,6 +1149,13 @@ ] }, "FromPort": 8080, + "GroupId": { + "Fn::GetAtt": [ + "testalbSecurityGroup0C84CDF9", + "GroupId" + ] + }, + "IpProtocol": "tcp", "ToPort": 8080 } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json index 8140221e1..5f1ba0d9d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json @@ -50,9 +50,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -69,7 +66,10 @@ "Key": "Name", "Value": "all-new-public-http/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -85,15 +85,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-public-http/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -110,12 +110,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -137,15 +137,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -161,9 +161,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -180,7 +177,10 @@ "Key": "Name", "Value": "all-new-public-http/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -196,15 +196,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-public-http/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -221,12 +221,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -248,15 +248,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -272,9 +272,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -291,7 +288,10 @@ "Key": "Name", "Value": "all-new-public-http/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -307,15 +307,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-public-http/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -332,12 +332,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -359,15 +359,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -383,9 +383,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -402,21 +399,24 @@ "Key": "Name", "Value": "all-new-public-http/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-public-http/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -433,21 +433,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -464,21 +461,24 @@ "Key": "Name", "Value": "all-new-public-http/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-public-http/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -495,21 +495,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -526,21 +523,24 @@ "Key": "Name", "Value": "all-new-public-http/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-public-http/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -557,12 +557,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -580,11 +580,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -606,7 +606,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc" + "Value": "all-new-public-http/Vpc/FlowLog" } ] } @@ -658,7 +658,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc" + "Value": "all-new-public-http/Vpc/FlowLog" } ] }, @@ -678,10 +678,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -692,10 +688,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc" + "Value": "all-new-public-http/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -704,10 +704,6 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -717,6 +713,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -728,16 +725,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -747,6 +743,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -758,27 +755,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -799,7 +784,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testconstructlbalb33E0EB59": { @@ -903,13 +903,6 @@ "testconstructlbalbSecurityGrouptoallnewpublichttptestconstructsgEFBACDED8080226DB910": { "Type": "AWS::EC2::SecurityGroupEgress", "Properties": { - "GroupId": { - "Fn::GetAtt": [ - "testconstructlbalbSecurityGroup5F187AF4", - "GroupId" - ] - }, - "IpProtocol": "tcp", "Description": "Load balancer to target", "DestinationSecurityGroupId": { "Fn::GetAtt": [ @@ -918,6 +911,13 @@ ] }, "FromPort": 8080, + "GroupId": { + "Fn::GetAtt": [ + "testconstructlbalbSecurityGroup5F187AF4", + "GroupId" + ] + }, + "IpProtocol": "tcp", "ToPort": 8080 }, "DependsOn": [ @@ -1179,18 +1179,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -1427,7 +1427,6 @@ "testconstructsgfromallnewpublichttptestconstructlbalbSecurityGroupA1A7ABDB8080D3FFEE20": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { - "IpProtocol": "tcp", "Description": "Load balancer to target", "FromPort": 8080, "GroupId": { @@ -1436,6 +1435,7 @@ "GroupId" ] }, + "IpProtocol": "tcp", "SourceSecurityGroupId": { "Fn::GetAtt": [ "testconstructlbalbSecurityGroup5F187AF4", @@ -1452,6 +1452,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1498,6 +1503,7 @@ } }, "DependsOn": [ + "testconstructtaskdefTaskRoleC60414C4", "testconstructtestconstructlistener484444F1" ] }, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json index 49d5ae829..8a08f7628 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json @@ -53,10 +53,10 @@ } } ], - "Priority": 10, "ListenerArn": { "Ref": "testconstructtestconstructlistener484444F1" - } + }, + "Priority": 10 } }, "Vpc8378EB38": { @@ -77,9 +77,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -96,7 +93,10 @@ "Key": "Name", "Value": "all-new-two-targets/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -112,15 +112,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-two-targets/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -137,12 +137,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -164,15 +164,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -188,9 +188,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -207,7 +204,10 @@ "Key": "Name", "Value": "all-new-two-targets/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -223,15 +223,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-two-targets/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -248,12 +248,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -275,15 +275,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -299,9 +299,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -318,7 +315,10 @@ "Key": "Name", "Value": "all-new-two-targets/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -334,15 +334,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-two-targets/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -359,12 +359,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -386,15 +386,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -410,9 +410,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -429,21 +426,24 @@ "Key": "Name", "Value": "all-new-two-targets/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-two-targets/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -460,21 +460,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -491,21 +488,24 @@ "Key": "Name", "Value": "all-new-two-targets/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-two-targets/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -522,21 +522,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -553,21 +550,24 @@ "Key": "Name", "Value": "all-new-two-targets/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "all-new-two-targets/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -584,12 +584,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -607,11 +607,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -633,7 +633,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc" + "Value": "all-new-two-targets/Vpc/FlowLog" } ] } @@ -685,7 +685,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc" + "Value": "all-new-two-targets/Vpc/FlowLog" } ] }, @@ -705,10 +705,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -719,10 +715,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc" + "Value": "all-new-two-targets/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -731,10 +731,6 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -744,6 +740,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -755,16 +752,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -774,6 +770,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -785,27 +782,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -826,7 +811,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testconstructlbalb33E0EB59": { @@ -930,13 +930,6 @@ "testconstructlbalbSecurityGrouptoallnewtwotargetstestconstructsgCB4347D58080785349CD": { "Type": "AWS::EC2::SecurityGroupEgress", "Properties": { - "GroupId": { - "Fn::GetAtt": [ - "testconstructlbalbSecurityGroup5F187AF4", - "GroupId" - ] - }, - "IpProtocol": "tcp", "Description": "Load balancer to target", "DestinationSecurityGroupId": { "Fn::GetAtt": [ @@ -945,6 +938,13 @@ ] }, "FromPort": 8080, + "GroupId": { + "Fn::GetAtt": [ + "testconstructlbalbSecurityGroup5F187AF4", + "GroupId" + ] + }, + "IpProtocol": "tcp", "ToPort": 8080 }, "DependsOn": [ @@ -1206,18 +1206,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -1454,7 +1454,6 @@ "testconstructsgfromallnewtwotargetstestconstructlbalbSecurityGroup7AE13AD9808027E2CC4F": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { - "IpProtocol": "tcp", "Description": "Load balancer to target", "FromPort": 8080, "GroupId": { @@ -1463,6 +1462,7 @@ "GroupId" ] }, + "IpProtocol": "tcp", "SourceSecurityGroupId": { "Fn::GetAtt": [ "testconstructlbalbSecurityGroup5F187AF4", @@ -1479,6 +1479,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1532,6 +1537,7 @@ } }, "DependsOn": [ + "testconstructtaskdefTaskRoleC60414C4", "testconstructtestconstructlistenerallnewtwotargetstargetsRule897FD7B6", "testconstructtestconstructlistener484444F1" ] diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json index a464cff7e..ebe2a257f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "privateApiExistingResources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "privateApiExistingResources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "privateApiExistingResources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "privateApiExistingResources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "privateApiExistingResources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "privateApiExistingResources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "privateApiExistingResources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "privateApiExistingResources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "privateApiExistingResources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "privateApiExistingResources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "privateApiExistingResources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "privateApiExistingResources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc" + "Value": "privateApiExistingResources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc" + "Value": "privateApiExistingResources/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,12 +657,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc" + "Value": "privateApiExistingResources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "lambdasg93781054": { @@ -807,18 +807,18 @@ }, "S3Key": "7caf594b8ad91abecca72f7f10a23a5cf446d05dc00d6194619935e7e3fd5a79.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -1249,18 +1249,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -1330,6 +1330,7 @@ "testonetg2tg6459EC7C": { "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", "Properties": { + "TargetType": "lambda", "Targets": [ { "Id": { @@ -1339,8 +1340,7 @@ ] } } - ], - "TargetType": "lambda" + ] }, "DependsOn": [ "LambdaFunctionInvoke2UTWxhlfyqbT5FTn5jvgbLgjFfJwzswGk55DU1HYAD69E89D" diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json index 26e533c99..c24fba1c8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json @@ -465,18 +465,18 @@ }, "S3Key": "7caf594b8ad91abecca72f7f10a23a5cf446d05dc00d6194619935e7e3fd5a79.zip" }, - "Role": { - "Fn::GetAtt": [ - "testoneLambdaFunctionServiceRoleE92573D3", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testoneLambdaFunctionServiceRoleE92573D3", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -581,6 +581,7 @@ "testonetg2tg6459EC7C": { "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", "Properties": { + "TargetType": "lambda", "Targets": [ { "Id": { @@ -590,8 +591,7 @@ ] } } - ], - "TargetType": "lambda" + ] }, "DependsOn": [ "testoneLambdaFunctionInvoke2UTWxhlfyqbT5FTn5jvgbLgjFfJwzswGk55DU1HY508A8518" @@ -615,9 +615,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -634,21 +631,24 @@ "Key": "Name", "Value": "privateApiNewResources/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "privateApiNewResources/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -665,9 +665,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -684,21 +681,24 @@ "Key": "Name", "Value": "privateApiNewResources/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "privateApiNewResources/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -715,9 +715,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -734,21 +731,24 @@ "Key": "Name", "Value": "privateApiNewResources/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "privateApiNewResources/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -780,7 +780,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc" + "Value": "privateApiNewResources/Vpc/FlowLog" } ] } @@ -832,7 +832,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc" + "Value": "privateApiNewResources/Vpc/FlowLog" } ] }, @@ -852,11 +852,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -867,12 +862,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc" + "Value": "privateApiNewResources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { @@ -904,18 +904,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json index f8efc14d1..ef2fc7821 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "publicApiExistingResources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiExistingResources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "publicApiExistingResources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiExistingResources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "publicApiExistingResources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiExistingResources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "publicApiExistingResources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiExistingResources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "publicApiExistingResources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiExistingResources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "publicApiExistingResources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiExistingResources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc" + "Value": "publicApiExistingResources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc" + "Value": "publicApiExistingResources/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,12 +657,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc" + "Value": "publicApiExistingResources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "lambdasg93781054": { @@ -807,18 +807,18 @@ }, "S3Key": "7caf594b8ad91abecca72f7f10a23a5cf446d05dc00d6194619935e7e3fd5a79.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -1249,18 +1249,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -1330,6 +1330,7 @@ "testonetg2tg6459EC7C": { "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", "Properties": { + "TargetType": "lambda", "Targets": [ { "Id": { @@ -1339,8 +1340,7 @@ ] } } - ], - "TargetType": "lambda" + ] }, "DependsOn": [ "LambdaFunctionInvoke2UTWxhlfyqbT5FTn5jvgbLgjFfJwzswGk55DU1HYAD69E89D" diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json index c01076512..b6c7be27d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json @@ -471,18 +471,18 @@ }, "S3Key": "7caf594b8ad91abecca72f7f10a23a5cf446d05dc00d6194619935e7e3fd5a79.zip" }, - "Role": { - "Fn::GetAtt": [ - "testoneLambdaFunctionServiceRoleE92573D3", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testoneLambdaFunctionServiceRoleE92573D3", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -593,6 +593,7 @@ "testonetg2tg6459EC7C": { "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", "Properties": { + "TargetType": "lambda", "Targets": [ { "Id": { @@ -602,8 +603,7 @@ ] } } - ], - "TargetType": "lambda" + ] }, "DependsOn": [ "testoneLambdaFunctionInvoke2UTWxhlfyqbT5FTn5jvgbLgjFfJwzswGk55DU1HY508A8518" @@ -627,9 +627,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -646,7 +643,10 @@ "Key": "Name", "Value": "publicApiNewResources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -662,15 +662,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiNewResources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -687,12 +687,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -714,15 +714,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -738,9 +738,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -757,7 +754,10 @@ "Key": "Name", "Value": "publicApiNewResources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -773,15 +773,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiNewResources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -798,12 +798,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -825,15 +825,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -849,9 +849,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -868,7 +865,10 @@ "Key": "Name", "Value": "publicApiNewResources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -884,15 +884,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiNewResources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -909,12 +909,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -936,15 +936,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -960,9 +960,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -979,21 +976,24 @@ "Key": "Name", "Value": "publicApiNewResources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiNewResources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -1010,21 +1010,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -1041,21 +1038,24 @@ "Key": "Name", "Value": "publicApiNewResources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiNewResources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -1072,21 +1072,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -1103,21 +1100,24 @@ "Key": "Name", "Value": "publicApiNewResources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "publicApiNewResources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -1134,12 +1134,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -1157,11 +1157,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -1183,7 +1183,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc" + "Value": "publicApiNewResources/Vpc/FlowLog" } ] } @@ -1235,7 +1235,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc" + "Value": "publicApiNewResources/Vpc/FlowLog" } ] }, @@ -1255,11 +1255,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1270,12 +1265,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc" + "Value": "publicApiNewResources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { @@ -1307,18 +1307,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json index fcf04b74a..447e2e805 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json @@ -471,18 +471,18 @@ }, "S3Key": "7caf594b8ad91abecca72f7f10a23a5cf446d05dc00d6194619935e7e3fd5a79.zip" }, - "Role": { - "Fn::GetAtt": [ - "testoneLambdaFunctionServiceRoleE92573D3", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testoneLambdaFunctionServiceRoleE92573D3", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -620,6 +620,7 @@ "testonetg2tg6459EC7C": { "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", "Properties": { + "TargetType": "lambda", "Targets": [ { "Id": { @@ -629,8 +630,7 @@ ] } } - ], - "TargetType": "lambda" + ] }, "DependsOn": [ "testoneLambdaFunctionInvoke2UTWxhlfyqbT5FTn5jvgbLgjFfJwzswGk55DU1HY508A8518" @@ -654,9 +654,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -673,7 +670,10 @@ "Key": "Name", "Value": "twoTargets/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -689,15 +689,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "twoTargets/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -714,12 +714,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -741,15 +741,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -765,9 +765,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -784,7 +781,10 @@ "Key": "Name", "Value": "twoTargets/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -800,15 +800,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "twoTargets/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -825,12 +825,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -852,15 +852,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -876,9 +876,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -895,7 +892,10 @@ "Key": "Name", "Value": "twoTargets/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -911,15 +911,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "twoTargets/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -936,12 +936,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -963,15 +963,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -987,9 +987,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -1006,21 +1003,24 @@ "Key": "Name", "Value": "twoTargets/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "twoTargets/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -1037,21 +1037,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -1068,21 +1065,24 @@ "Key": "Name", "Value": "twoTargets/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "twoTargets/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -1099,21 +1099,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -1130,21 +1127,24 @@ "Key": "Name", "Value": "twoTargets/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "twoTargets/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -1161,12 +1161,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -1184,11 +1184,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -1210,7 +1210,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc" + "Value": "twoTargets/Vpc/FlowLog" } ] } @@ -1262,7 +1262,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc" + "Value": "twoTargets/Vpc/FlowLog" } ] }, @@ -1282,11 +1282,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1297,12 +1292,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc" + "Value": "twoTargets/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { @@ -1334,18 +1334,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -1520,18 +1520,18 @@ }, "S3Key": "7caf594b8ad91abecca72f7f10a23a5cf446d05dc00d6194619935e7e3fd5a79.zip" }, - "Role": { - "Fn::GetAtt": [ - "testtwoLambdaFunctionServiceRoleD100E5F8", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testtwoLambdaFunctionServiceRoleD100E5F8", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -1611,6 +1611,7 @@ "testtwotg2tg35BE6697": { "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", "Properties": { + "TargetType": "lambda", "Targets": [ { "Id": { @@ -1620,8 +1621,7 @@ ] } } - ], - "TargetType": "lambda" + ] }, "DependsOn": [ "testtwoLambdaFunctionInvoke2UTWxhlfyqbT5FTn5jvgbLgjFfJwzswGk55DU1HY068D8D47" diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json index f84b58e71..159abab0a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json @@ -895,14 +895,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -967,109 +967,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json index c8bd96b1b..46696cee7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json @@ -895,14 +895,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -967,109 +967,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json index 1c1d7bca1..120092782 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json @@ -934,14 +934,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -1006,109 +1006,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json index a16dfbfb0..954c1541e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json @@ -895,14 +895,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -967,109 +967,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json index 74bc80b11..ba44a3a00 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json @@ -895,14 +895,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -967,109 +967,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json index 76821d838..1dda93107 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json @@ -421,14 +421,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -465,109 +465,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json index ac97c2c9b..017e02b08 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json @@ -421,14 +421,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -465,109 +465,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json index e1188e25c..4685cedc1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json @@ -338,14 +338,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -382,109 +382,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json index 9765898cd..b7373e8e3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json @@ -380,14 +380,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -424,109 +424,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json index f78e1bcf4..f32082de5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json @@ -398,14 +398,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -442,109 +442,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json index d3ba2fc04..aa9a6f24b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json @@ -585,14 +585,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -629,109 +629,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json index f9563b6ca..266cdd2a2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json @@ -616,14 +616,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -660,109 +660,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json index f22102846..5b99a5606 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json @@ -584,14 +584,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -628,109 +628,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json index 3e433548d..1a5473490 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json @@ -647,14 +647,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -691,109 +691,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json index fad104cc0..6aaa2e8cf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json @@ -208,14 +208,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -560,109 +560,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json index e5b92cc7a..6fdb685d1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json @@ -471,14 +471,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -515,109 +515,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json index aa73ded9b..495087c8b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json @@ -561,14 +561,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -605,109 +605,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json index 5796dedf8..d2b8fd4b5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json @@ -98,18 +98,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "testcognitoapigatewaylambdaLambdaFunctionServiceRole943D8510", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testcognitoapigatewaylambdaLambdaFunctionServiceRole943D8510", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -171,10 +171,10 @@ "testcognitoapigatewaylambdaLambdaRestApiDeployment96AFD8CA5d8e3257747e529ac6f9e48e8d20548e": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testcognitoapigatewaylambdaLambdaRestApi2E272431" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testcognitoapigatewaylambdaLambdaRestApiproxyANY18BA6246", @@ -195,9 +195,6 @@ "testcognitoapigatewaylambdaLambdaRestApiDeploymentStageprod850C17D1": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testcognitoapigatewaylambdaLambdaRestApi2E272431" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -218,6 +215,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testcognitoapigatewaylambdaLambdaRestApi2E272431" + }, "StageName": "prod", "TracingEnabled": true } @@ -318,17 +318,11 @@ "testcognitoapigatewaylambdaLambdaRestApiproxyANY18BA6246": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "testcognitoapigatewaylambdaLambdaRestApiproxy23E1DA20" - }, - "RestApiId": { - "Ref": "testcognitoapigatewaylambdaLambdaRestApi2E272431" - }, "AuthorizationType": "COGNITO_USER_POOLS", "AuthorizerId": { "Ref": "testcognitoapigatewaylambdaCognitoAuthorizer170CACC9" }, + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -355,6 +349,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "testcognitoapigatewaylambdaLambdaRestApiproxy23E1DA20" + }, + "RestApiId": { + "Ref": "testcognitoapigatewaylambdaLambdaRestApi2E272431" } } }, @@ -439,20 +439,11 @@ "testcognitoapigatewaylambdaLambdaRestApiANY1BCFE40A": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "testcognitoapigatewaylambdaLambdaRestApi2E272431", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testcognitoapigatewaylambdaLambdaRestApi2E272431" - }, "AuthorizationType": "COGNITO_USER_POOLS", "AuthorizerId": { "Ref": "testcognitoapigatewaylambdaCognitoAuthorizer170CACC9" }, + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -479,6 +470,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "testcognitoapigatewaylambdaLambdaRestApi2E272431", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testcognitoapigatewaylambdaLambdaRestApi2E272431" } } }, @@ -608,9 +608,6 @@ "testcognitoapigatewaylambdaCognitoUserPoolClientDA118627": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testcognitoapigatewaylambdaCognitoUserPoolD5E74489" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -628,18 +625,17 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testcognitoapigatewaylambdaCognitoUserPoolD5E74489" + } } }, "testcognitoapigatewaylambdaCognitoAuthorizer170CACC9": { "Type": "AWS::ApiGateway::Authorizer", "Properties": { - "Name": "authorizer", - "RestApiId": { - "Ref": "testcognitoapigatewaylambdaLambdaRestApi2E272431" - }, - "Type": "COGNITO_USER_POOLS", "IdentitySource": "method.request.header.Authorization", + "Name": "authorizer", "ProviderARNs": [ { "Fn::GetAtt": [ @@ -647,7 +643,11 @@ "Arn" ] } - ] + ], + "RestApiId": { + "Ref": "testcognitoapigatewaylambdaLambdaRestApi2E272431" + }, + "Type": "COGNITO_USER_POOLS" } } }, @@ -713,4 +713,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json index 5eab067ed..ff8d022f8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json @@ -172,12 +172,6 @@ }, "S3Key": "92927de5fcc3aea277bddecb845bee318fb502f7375daedbdafb72c0400bc197.zip" }, - "Role": { - "Fn::GetAtt": [ - "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionServiceRoleEC11512B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -190,6 +184,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionServiceRoleEC11512B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -245,9 +245,6 @@ "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionDynamoDBEventSourcedeploywithvpctestddbstreamslambdaeskDynamoDBStreamsToLambdaDynamoTableB7F9F75CD09B2055": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionB70B7296" - }, "BatchSize": 100, "BisectBatchOnFunctionError": true, "DestinationConfig": { @@ -266,6 +263,9 @@ "StreamArn" ] }, + "FunctionName": { + "Ref": "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionB70B7296" + }, "MaximumRecordAgeInSeconds": 86400, "MaximumRetryAttempts": 500, "StartingPosition": "TRIM_HORIZON" @@ -313,9 +313,6 @@ "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPoolClient25D50E3D": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPool97EA2952" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -333,7 +330,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPool97EA2952" + } } }, "testddbstreamslambdaeskLambdaToElasticSearchCognitoIdentityPoolFAA4D969": { @@ -692,9 +692,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchStatusRedAlarmAFFE3439": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -705,9 +705,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchStatusYellowAlarm44E1DC4E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -718,9 +718,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchFreeStorageSpaceTooLowAlarm65BF7F2F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -731,9 +731,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchIndexWritesBlockedTooHighAlarmCE3D0C51": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -744,9 +744,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchAutomatedSnapshotFailureTooHighAlarmFD8E066E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -757,9 +757,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchCPUUtilizationTooHighAlarm274094A6": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -770,9 +770,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchJVMMemoryPressureTooHighAlarm2E49D5CC": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -783,9 +783,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchMasterCPUUtilizationTooHighAlarm05E1EBEF": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -796,9 +796,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchMasterJVMMemoryPressureTooHighAlarm1090161B": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -824,9 +824,6 @@ "testddbstreamslambdaeskVpcisolatedSubnet1Subnet3A238B01": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "testddbstreamslambdaeskVpcB583E197" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -843,21 +840,24 @@ "Key": "Name", "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "testddbstreamslambdaeskVpcB583E197" + } } }, "testddbstreamslambdaeskVpcisolatedSubnet1RouteTable27ABBE41": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "testddbstreamslambdaeskVpcB583E197" - }, "Tags": [ { "Key": "Name", "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "testddbstreamslambdaeskVpcB583E197" + } } }, "testddbstreamslambdaeskVpcisolatedSubnet1RouteTableAssociation2E533936": { @@ -874,9 +874,6 @@ "testddbstreamslambdaeskVpcisolatedSubnet2SubnetDE9E844E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "testddbstreamslambdaeskVpcB583E197" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -893,21 +890,24 @@ "Key": "Name", "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "testddbstreamslambdaeskVpcB583E197" + } } }, "testddbstreamslambdaeskVpcisolatedSubnet2RouteTable358580C2": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "testddbstreamslambdaeskVpcB583E197" - }, "Tags": [ { "Key": "Name", "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "testddbstreamslambdaeskVpcB583E197" + } } }, "testddbstreamslambdaeskVpcisolatedSubnet2RouteTableAssociation77A663A5": { @@ -924,9 +924,6 @@ "testddbstreamslambdaeskVpcisolatedSubnet3Subnet3B5285ED": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "testddbstreamslambdaeskVpcB583E197" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -943,21 +940,24 @@ "Key": "Name", "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "testddbstreamslambdaeskVpcB583E197" + } } }, "testddbstreamslambdaeskVpcisolatedSubnet3RouteTable7F8548D9": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "testddbstreamslambdaeskVpcB583E197" - }, "Tags": [ { "Key": "Name", "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "testddbstreamslambdaeskVpcB583E197" + } } }, "testddbstreamslambdaeskVpcisolatedSubnet3RouteTableAssociation77FF5F32": { @@ -989,7 +989,7 @@ "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc" + "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/FlowLog" } ] } @@ -1041,7 +1041,7 @@ "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc" + "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/FlowLog" } ] }, @@ -1061,10 +1061,6 @@ "testddbstreamslambdaeskVpcFlowLogD9278B4C": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "testddbstreamslambdaeskVpcB583E197" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "testddbstreamslambdaeskVpcFlowLogIAMRole8B3A466E", @@ -1075,10 +1071,14 @@ "LogGroupName": { "Ref": "testddbstreamslambdaeskVpcFlowLogLogGroup4DB5270C" }, + "ResourceId": { + "Ref": "testddbstreamslambdaeskVpcB583E197" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc" + "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1087,19 +1087,19 @@ "testddbstreamslambdaeskDynamoDBStreamsToLambdaDynamoTableDD18004A": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json index aee329669..e1a92f7b7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json @@ -131,12 +131,6 @@ }, "S3Key": "92927de5fcc3aea277bddecb845bee318fb502f7375daedbdafb72c0400bc197.zip" }, - "Role": { - "Fn::GetAtt": [ - "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionServiceRoleEC11512B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -149,6 +143,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionServiceRoleEC11512B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -180,9 +180,6 @@ "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionDynamoDBEventSourcenoargumentstestddbstreamslambdaeskDynamoDBStreamsToLambdaDynamoTable6C5773679DA39002": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionB70B7296" - }, "BatchSize": 100, "BisectBatchOnFunctionError": true, "DestinationConfig": { @@ -201,6 +198,9 @@ "StreamArn" ] }, + "FunctionName": { + "Ref": "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionB70B7296" + }, "MaximumRecordAgeInSeconds": 86400, "MaximumRetryAttempts": 500, "StartingPosition": "TRIM_HORIZON" @@ -243,9 +243,6 @@ "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPoolClient25D50E3D": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPool97EA2952" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -263,7 +260,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPool97EA2952" + } } }, "testddbstreamslambdaeskLambdaToElasticSearchCognitoIdentityPoolFAA4D969": { @@ -601,9 +601,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchStatusRedAlarmAFFE3439": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -614,9 +614,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchStatusYellowAlarm44E1DC4E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -627,9 +627,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchFreeStorageSpaceTooLowAlarm65BF7F2F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -640,9 +640,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchIndexWritesBlockedTooHighAlarmCE3D0C51": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -653,9 +653,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchAutomatedSnapshotFailureTooHighAlarmFD8E066E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -666,9 +666,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchCPUUtilizationTooHighAlarm274094A6": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -679,9 +679,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchJVMMemoryPressureTooHighAlarm2E49D5CC": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -692,9 +692,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchMasterCPUUtilizationTooHighAlarm05E1EBEF": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -705,9 +705,9 @@ "testddbstreamslambdaeskLambdaToElasticSearchMasterJVMMemoryPressureTooHighAlarm1090161B": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -718,19 +718,19 @@ "testddbstreamslambdaeskDynamoDBStreamsToLambdaDynamoTableDD18004A": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json index 1112c6531..8a3494f26 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json @@ -182,14 +182,14 @@ }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -574,109 +574,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json index 4117f3456..a3ee4a61f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json @@ -3,7 +3,7 @@ "existingeventbusA5B80487": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "test-existing-lambda" } }, "testeventbridgelambdaLambdaFunctionServiceRole6D02CEEE": { @@ -104,18 +104,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "testeventbridgelambdaLambdaFunctionServiceRole6D02CEEE", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testeventbridgelambdaLambdaFunctionServiceRole6D02CEEE", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts index 6289de86e..18126b108 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts @@ -21,7 +21,7 @@ import { generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); -const existingEventBus = new events.EventBus(stack, `existing-event-bus`, { eventBusName: 'test' }); +const existingEventBus = new events.EventBus(stack, `existing-event-bus`, { eventBusName: 'test-existing-lambda' }); const props: EventbridgeToLambdaProps = { lambdaFunctionProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json index bdf10e99d..0090e1e2d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json @@ -98,18 +98,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "testeventbridgelambdaLambdaFunctionServiceRole6D02CEEE", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testeventbridgelambdaLambdaFunctionServiceRole6D02CEEE", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -157,17 +157,17 @@ } } }, - "testeventbridgelambdatest2F604440": { + "testeventbridgelambdatestnewlambdaA726ECBB": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "test-new-lambda" } }, "testeventbridgelambdaEventsRule7DB0954D": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": { - "Ref": "testeventbridgelambdatest2F604440" + "Ref": "testeventbridgelambdatestnewlambdaA726ECBB" }, "EventPattern": { "source": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts index f1af26381..adf01d17c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts @@ -26,7 +26,7 @@ const props: EventbridgeToLambdaProps = { runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, - eventBusProps: { eventBusName: 'test' }, + eventBusProps: { eventBusName: 'test-new-lambda' }, eventRuleProps: { eventPattern: { source: ['solutionsconstructs'] diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json index 42bbbcb11..f5018b3b4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json @@ -98,18 +98,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "testeventbridgelambdaLambdaFunctionServiceRole6D02CEEE", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testeventbridgelambdaLambdaFunctionServiceRole6D02CEEE", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json index 6bcf0a409..dee9dbace 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json @@ -98,18 +98,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -141,7 +141,7 @@ "existingeventbusA5B80487": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "test-existing" } }, "testeventbridgestepfunctionsneweventbusconstructStateMachineLogGroup6DC6AD59": { @@ -285,17 +285,11 @@ "testeventbridgestepfunctionsneweventbusconstructStateMachine5B0C5609": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "testeventbridgestepfunctionsneweventbusconstructStateMachineRole88F30AE1", - "Arn" - ] - }, "DefinitionString": { "Fn::Join": [ "", [ - "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"Next\":\"LambdaTask\"},\"LambdaTask\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"Resource\":\"arn:", + "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"Next\":\"LambdaTask\"},\"LambdaTask\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"Resource\":\"arn:", { "Ref": "AWS::Partition" }, @@ -324,6 +318,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "testeventbridgestepfunctionsneweventbusconstructStateMachineRole88F30AE1", + "Arn" + ] } }, "DependsOn": [ @@ -404,9 +404,8 @@ "testeventbridgestepfunctionsneweventbusconstructExecutionFailedAlarmF5234856": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -415,6 +414,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -425,9 +425,8 @@ "testeventbridgestepfunctionsneweventbusconstructExecutionThrottledAlarm08AFD5C8": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -436,6 +435,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -446,9 +446,8 @@ "testeventbridgestepfunctionsneweventbusconstructExecutionAbortedAlarmAA68F975": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -457,6 +456,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -497,6 +497,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -530,6 +533,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts index b71b9f83a..d4f52042f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts @@ -37,7 +37,7 @@ const submitJob = new tasks.LambdaInvoke(stack, 'LambdaTask', { const startState = new stepfunctions.Pass(stack, 'StartState'); startState.next(submitJob); -const existingEventBus = new EventBus(stack, `existing-event-bus`, { eventBusName: 'test'}); +const existingEventBus = new EventBus(stack, `existing-event-bus`, { eventBusName: 'test-existing'}); const props: EventbridgeToStepfunctionsProps = { stateMachineProps: { definition: startState, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json index f1e000cdf..82b3ca7cd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json @@ -98,18 +98,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -279,17 +279,11 @@ "testeventbridgestepfunctionsneweventbusconstructStateMachine5B0C5609": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "testeventbridgestepfunctionsneweventbusconstructStateMachineRole88F30AE1", - "Arn" - ] - }, "DefinitionString": { "Fn::Join": [ "", [ - "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"Next\":\"LambdaTask\"},\"LambdaTask\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"Resource\":\"arn:", + "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"Next\":\"LambdaTask\"},\"LambdaTask\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"Resource\":\"arn:", { "Ref": "AWS::Partition" }, @@ -318,6 +312,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "testeventbridgestepfunctionsneweventbusconstructStateMachineRole88F30AE1", + "Arn" + ] } }, "DependsOn": [ @@ -367,17 +367,17 @@ ] } }, - "testeventbridgestepfunctionsneweventbusconstructtestE4F3554B": { + "testeventbridgestepfunctionsneweventbusconstructtestnewA01E6B5C": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "test-new" } }, "testeventbridgestepfunctionsneweventbusconstructEventsRule471B9F20": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": { - "Ref": "testeventbridgestepfunctionsneweventbusconstructtestE4F3554B" + "Ref": "testeventbridgestepfunctionsneweventbusconstructtestnewA01E6B5C" }, "EventPattern": { "source": [ @@ -404,9 +404,8 @@ "testeventbridgestepfunctionsneweventbusconstructExecutionFailedAlarmF5234856": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -415,6 +414,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -425,9 +425,8 @@ "testeventbridgestepfunctionsneweventbusconstructExecutionThrottledAlarm08AFD5C8": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -436,6 +435,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -446,9 +446,8 @@ "testeventbridgestepfunctionsneweventbusconstructExecutionAbortedAlarmAA68F975": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -457,6 +456,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -497,6 +497,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -530,6 +533,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts index 275fc178f..6a1b5614a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts @@ -46,7 +46,7 @@ const props: EventbridgeToStepfunctionsProps = { source: ['solutionsconstructs'] } }, - eventBusProps: { eventBusName: 'test' }, + eventBusProps: { eventBusName: 'test-new' }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, logGroupName: "integ-test-new-eventbus" diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json index bb8778950..2511b0adc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json @@ -135,12 +135,6 @@ "testeventbridgestepfunctionsconstructStateMachine08688697": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "testeventbridgestepfunctionsconstructStateMachineRoleED595422", - "Arn" - ] - }, "DefinitionString": "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"End\":true}}}", "LoggingConfiguration": { "Destinations": [ @@ -156,6 +150,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "testeventbridgestepfunctionsconstructStateMachineRoleED595422", + "Arn" + ] } }, "DependsOn": [ @@ -229,9 +229,8 @@ "testeventbridgestepfunctionsconstructExecutionFailedAlarm57DF694C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -240,6 +239,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -250,9 +250,8 @@ "testeventbridgestepfunctionsconstructExecutionThrottledAlarmE43E1426": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -261,6 +260,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -271,9 +271,8 @@ "testeventbridgestepfunctionsconstructExecutionAbortedAlarmAACA66A8": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -282,6 +281,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -322,6 +322,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -355,6 +358,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json index b97edd5c9..21d73496a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json @@ -98,18 +98,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -279,17 +279,11 @@ "testeventbridgestepfunctionsandlambdaconstructStateMachineACD2232F": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "testeventbridgestepfunctionsandlambdaconstructStateMachineRoleD7589F39", - "Arn" - ] - }, "DefinitionString": { "Fn::Join": [ "", [ - "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"Next\":\"LambdaTask\"},\"LambdaTask\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"Resource\":\"arn:", + "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"Next\":\"LambdaTask\"},\"LambdaTask\":{\"End\":true,\"Retry\":[{\"ErrorEquals\":[\"Lambda.ClientExecutionTimeoutException\",\"Lambda.ServiceException\",\"Lambda.AWSLambdaException\",\"Lambda.SdkClientException\"],\"IntervalSeconds\":2,\"MaxAttempts\":6,\"BackoffRate\":2}],\"Type\":\"Task\",\"Resource\":\"arn:", { "Ref": "AWS::Partition" }, @@ -318,6 +312,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "testeventbridgestepfunctionsandlambdaconstructStateMachineRoleD7589F39", + "Arn" + ] } }, "DependsOn": [ @@ -391,9 +391,8 @@ "testeventbridgestepfunctionsandlambdaconstructExecutionFailedAlarm61E476BC": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -402,6 +401,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -412,9 +412,8 @@ "testeventbridgestepfunctionsandlambdaconstructExecutionThrottledAlarm70141701": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -423,6 +422,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -433,9 +433,8 @@ "testeventbridgestepfunctionsandlambdaconstructExecutionAbortedAlarm8E79E87E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -444,6 +443,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -484,6 +484,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -517,6 +520,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.expected.json index 4b99550a6..d02e765af 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,21 +657,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,12 +753,6 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" - } - }, - "VpcDDB49FBEC5F": { - "Type": "AWS::EC2::VPCEndpoint", - "Properties": { "ServiceName": { "Fn::Join": [ "", @@ -782,13 +761,19 @@ { "Ref": "AWS::Region" }, - ".dynamodb" + ".s3" ] ] }, + "VpcEndpointType": "Gateway", "VpcId": { "Ref": "Vpc8378EB38" - }, + } + } + }, + "VpcDDB49FBEC5F": { + "Type": "AWS::EC2::VPCEndpoint", + "Properties": { "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -809,25 +794,40 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".dynamodb" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "DynamoTableB2B22E15": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -1104,6 +1104,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1138,7 +1143,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.new-resources.expected.json index d64258e2f..3b243e331 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.new-resources.expected.json @@ -4,19 +4,19 @@ "testconstructDynamoTable67BDAFC5": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -45,9 +45,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -64,7 +61,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -80,15 +80,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -105,12 +105,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -132,15 +132,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -156,9 +156,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -175,7 +172,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -191,15 +191,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -216,12 +216,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -243,15 +243,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -267,9 +267,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -286,7 +283,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -302,15 +302,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -327,12 +327,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -354,15 +354,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -378,9 +378,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -397,21 +394,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -428,21 +428,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -459,21 +456,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -490,21 +490,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -521,21 +518,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -552,12 +552,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -575,11 +575,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -601,7 +601,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] } @@ -653,7 +653,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] }, @@ -673,11 +673,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -688,32 +683,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcDDB49FBEC5F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".dynamodb" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -734,16 +719,27 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".dynamodb" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -753,6 +749,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -764,16 +761,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -783,6 +779,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -794,27 +791,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -835,7 +820,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newresourcesECRAPIsecuritygroupE52BAE3F": { @@ -1104,6 +1104,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1138,7 +1143,11 @@ "TaskDefinition": { "Ref": "testconstructtaskdef8BD1F9E4" } - } + }, + "DependsOn": [ + "testconstructtaskdefTaskRoleDefaultPolicyF34A1535", + "testconstructtaskdefTaskRoleC60414C4" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.expected.json index 0183470bc..befd1b89b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,21 +657,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,16 +753,27 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcCLOUDWATCHEVENTS1A0DAFBF": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.events", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -787,6 +783,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.events", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -798,7 +795,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "existingresourcesECRAPIsecuritygroup78294485": { @@ -1040,6 +1040,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1074,7 +1079,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] }, "existingeventbusA5B80487": { "Type": "AWS::Events::EventBus", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.new-resources.expected.json index b7f47b52e..15a6c4295 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.new-resources.expected.json @@ -25,9 +25,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -44,7 +41,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -60,15 +60,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -85,12 +85,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -112,15 +112,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -136,9 +136,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -155,7 +152,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -171,15 +171,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -196,12 +196,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -223,15 +223,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -247,9 +247,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -266,7 +263,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -282,15 +282,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -307,12 +307,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -334,15 +334,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -358,9 +358,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -377,21 +374,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -408,21 +408,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -439,21 +436,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -470,21 +470,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -501,21 +498,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -532,12 +532,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -555,11 +555,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -581,7 +581,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] } @@ -633,7 +633,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] }, @@ -653,11 +653,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -668,21 +663,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcCLOUDWATCHEVENTS1A0DAFBF": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.events", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -692,6 +688,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.events", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -703,16 +700,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -722,6 +718,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -733,16 +730,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -752,6 +748,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -763,27 +760,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -804,7 +789,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newresourcesCLOUDWATCHEVENTSsecuritygroupC0F12F92": { @@ -1104,6 +1104,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1138,7 +1143,11 @@ "TaskDefinition": { "Ref": "testconstructtaskdef8BD1F9E4" } - } + }, + "DependsOn": [ + "testconstructtaskdefTaskRoleDefaultPolicyF34A1535", + "testconstructtaskdefTaskRoleC60414C4" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json index 08a24d410..5f1f86256 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json @@ -18,9 +18,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -37,7 +34,10 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -53,15 +53,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -78,12 +78,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -105,15 +105,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -129,9 +129,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -148,7 +145,10 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -164,15 +164,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -189,12 +189,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -216,15 +216,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -240,9 +240,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -259,7 +256,10 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -275,15 +275,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -300,12 +300,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -327,15 +327,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -351,9 +351,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -370,21 +367,24 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -401,21 +401,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -432,21 +429,24 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -463,21 +463,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -494,21 +491,24 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -525,12 +525,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -548,11 +548,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "existingFargateService/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "existingFargateService/Vpc/FlowLog" } ] }, @@ -646,10 +646,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -660,10 +656,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "existingFargateService/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -672,6 +672,15 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingFargateServiceECRAPIsecuritygroup5EE2643E", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -684,18 +693,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingFargateServiceECRAPIsecuritygroup5EE2643E", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -707,12 +704,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingFargateServiceECRDKRsecuritygroup41F182BE", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -725,18 +734,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingFargateServiceECRDKRsecuritygroup41F182BE", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -748,27 +745,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -789,12 +774,6 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" - } - }, - "VpcKINESISFIREHOSE4115B5D1": { - "Type": "AWS::EC2::VPCEndpoint", - "Properties": { "ServiceName": { "Fn::Join": [ "", @@ -803,13 +782,19 @@ { "Ref": "AWS::Region" }, - ".kinesis-firehose" + ".s3" ] ] }, + "VpcEndpointType": "Gateway", "VpcId": { "Ref": "Vpc8378EB38" - }, + } + } + }, + "VpcKINESISFIREHOSE4115B5D1": { + "Type": "AWS::EC2::VPCEndpoint", + "Properties": { "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -819,6 +804,18 @@ ] } ], + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".kinesis-firehose" + ] + ] + }, "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -830,7 +827,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "destinationfirehoseS3LoggingBucket19A32AC0": { @@ -1383,18 +1383,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -1672,6 +1672,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1706,7 +1711,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] }, "existingFargateServiceKINESISFIREHOSEsecuritygroup9CDC51DB": { "Type": "AWS::EC2::SecurityGroup", @@ -1767,109 +1776,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json index 8289c2e55..dd8a62f26 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json @@ -18,9 +18,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -37,7 +34,10 @@ "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -53,15 +53,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -78,12 +78,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -105,15 +105,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -129,9 +129,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -148,7 +145,10 @@ "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -164,15 +164,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -189,12 +189,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -216,15 +216,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -240,9 +240,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -259,7 +256,10 @@ "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -275,15 +275,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -300,12 +300,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -327,15 +327,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -351,9 +351,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -370,21 +367,24 @@ "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -401,21 +401,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -432,21 +429,24 @@ "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -463,21 +463,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -494,21 +491,24 @@ "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -525,12 +525,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -548,11 +548,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "existingVpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "existingVpc/Vpc/FlowLog" } ] }, @@ -646,10 +646,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -660,10 +656,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "existingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -672,6 +672,15 @@ "VpcKINESISFIREHOSE4115B5D1": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingVpcKINESISFIREHOSEsecuritygroupCC06079B", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -684,18 +693,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingVpcKINESISFIREHOSEsecuritygroupCC06079B", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -707,12 +704,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingVpcECRAPIsecuritygroupB3E4A376", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -725,18 +734,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingVpcECRAPIsecuritygroupB3E4A376", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -748,12 +745,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingVpcECRDKRsecuritygroup0500FAE6", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -766,18 +775,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingVpcECRDKRsecuritygroup0500FAE6", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -789,27 +786,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -830,7 +815,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "destinationfirehoseS3LoggingBucket19A32AC0": { @@ -1383,18 +1383,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -1730,6 +1730,11 @@ "Ref": "testfargatekinesisstreamsclusterEA5A2AD7" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1764,110 +1769,11 @@ "TaskDefinition": { "Ref": "testfargatekinesisstreamstaskdef402FE0B3" } - } - } - }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } + "DependsOn": [ + "testfargatekinesisstreamstaskdefTaskRoleDefaultPolicyAE7EF3E4", + "testfargatekinesisstreamstaskdefTaskRole9811F3BE" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json index 1dcc7d488..45d796abc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json @@ -550,18 +550,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -615,9 +615,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -634,7 +631,10 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -650,15 +650,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -675,12 +675,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -702,15 +702,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -726,9 +726,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -745,7 +742,10 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -761,15 +761,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -786,12 +786,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -813,15 +813,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -837,9 +837,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -856,7 +853,10 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -872,15 +872,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -897,12 +897,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -924,15 +924,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -948,9 +948,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -967,21 +964,24 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -998,21 +998,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -1029,21 +1026,24 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -1060,21 +1060,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -1091,21 +1088,24 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -1122,12 +1122,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -1145,11 +1145,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -1171,7 +1171,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "fargateServiceFromProps/Vpc/FlowLog" } ] } @@ -1223,7 +1223,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "fargateServiceFromProps/Vpc/FlowLog" } ] }, @@ -1243,10 +1243,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1257,10 +1253,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "fargateServiceFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1269,6 +1269,15 @@ "VpcKINESISFIREHOSE4115B5D1": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "fargateServiceFromPropsKINESISFIREHOSEsecuritygroupC0011304", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -1281,18 +1290,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "fargateServiceFromPropsKINESISFIREHOSEsecuritygroupC0011304", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1304,12 +1301,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "fargateServiceFromPropsECRAPIsecuritygroup5784F80B", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -1322,18 +1331,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "fargateServiceFromPropsECRAPIsecuritygroup5784F80B", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1345,12 +1342,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "fargateServiceFromPropsECRDKRsecuritygroup9E1C301F", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -1363,18 +1372,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "fargateServiceFromPropsECRDKRsecuritygroup9E1C301F", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1386,27 +1383,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -1427,7 +1412,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "fargateServiceFromPropsKINESISFIREHOSEsecuritygroupC0011304": { @@ -1730,6 +1730,11 @@ "Ref": "testfargatekinesisstreamsclusterEA5A2AD7" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1765,110 +1770,11 @@ "TaskDefinition": { "Ref": "testfargatekinesisstreamstaskdef402FE0B3" } - } - } - }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } + "DependsOn": [ + "testfargatekinesisstreamstaskdefTaskRoleDefaultPolicyAE7EF3E4", + "testfargatekinesisstreamstaskdefTaskRole9811F3BE" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json index 9383c2a97..a9acca727 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json @@ -546,18 +546,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "40aa87cdf43c4095cec18bc443965f22ab2f8c1ace47e482a0ba4e35d83b0cc9.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -611,9 +611,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -630,7 +627,10 @@ "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -646,15 +646,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -671,12 +671,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -698,15 +698,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -722,9 +722,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -741,7 +738,10 @@ "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -757,15 +757,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -782,12 +782,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -809,15 +809,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -833,9 +833,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -852,7 +849,10 @@ "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -868,15 +868,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -893,12 +893,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -920,15 +920,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -944,9 +944,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -963,21 +960,24 @@ "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -994,21 +994,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -1025,21 +1022,24 @@ "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -1056,21 +1056,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -1087,21 +1084,24 @@ "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -1118,12 +1118,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -1141,11 +1141,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -1167,7 +1167,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "noArguments/Vpc/FlowLog" } ] } @@ -1219,7 +1219,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "noArguments/Vpc/FlowLog" } ] }, @@ -1239,10 +1239,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1253,10 +1249,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "noArguments/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1265,10 +1265,6 @@ "VpcKINESISFIREHOSE4115B5D1": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.kinesis-firehose", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -1278,6 +1274,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.kinesis-firehose", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1289,16 +1286,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -1308,6 +1304,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1319,16 +1316,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -1338,6 +1334,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1349,27 +1346,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -1390,7 +1375,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "noArgumentsKINESISFIREHOSEsecuritygroupBE0C0999": { @@ -1693,6 +1693,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1727,7 +1732,11 @@ "TaskDefinition": { "Ref": "testconstructtaskdef8BD1F9E4" } - } + }, + "DependsOn": [ + "testconstructtaskdefTaskRoleDefaultPolicyF34A1535", + "testconstructtaskdefTaskRoleC60414C4" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json index 9e9e1b4a9..1c7b97b8e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json @@ -550,18 +550,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -615,9 +615,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.100.0.0/19", "MapPublicIpOnLaunch": true, @@ -634,7 +631,10 @@ "Key": "Name", "Value": "vpcFromprops/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -650,15 +650,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromprops/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -675,12 +675,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -702,15 +702,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -726,9 +726,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.100.32.0/19", "MapPublicIpOnLaunch": true, @@ -745,7 +742,10 @@ "Key": "Name", "Value": "vpcFromprops/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -761,15 +761,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromprops/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -786,12 +786,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -813,15 +813,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -837,9 +837,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.100.64.0/19", "MapPublicIpOnLaunch": true, @@ -856,7 +853,10 @@ "Key": "Name", "Value": "vpcFromprops/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -872,15 +872,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromprops/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -897,12 +897,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -924,15 +924,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -948,9 +948,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.100.96.0/19", "MapPublicIpOnLaunch": false, @@ -967,21 +964,24 @@ "Key": "Name", "Value": "vpcFromprops/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromprops/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -998,21 +998,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.100.128.0/19", "MapPublicIpOnLaunch": false, @@ -1029,21 +1026,24 @@ "Key": "Name", "Value": "vpcFromprops/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromprops/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -1060,21 +1060,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.100.160.0/19", "MapPublicIpOnLaunch": false, @@ -1091,21 +1088,24 @@ "Key": "Name", "Value": "vpcFromprops/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromprops/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -1122,12 +1122,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -1145,11 +1145,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -1171,7 +1171,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc" + "Value": "vpcFromprops/Vpc/FlowLog" } ] } @@ -1223,7 +1223,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc" + "Value": "vpcFromprops/Vpc/FlowLog" } ] }, @@ -1243,10 +1243,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1257,10 +1253,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc" + "Value": "vpcFromprops/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1269,6 +1269,15 @@ "VpcKINESISFIREHOSE4115B5D1": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "vpcFrompropsKINESISFIREHOSEsecuritygroup537BDD19", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -1281,18 +1290,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "vpcFrompropsKINESISFIREHOSEsecuritygroup537BDD19", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1304,12 +1301,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "vpcFrompropsECRAPIsecuritygroupB070D1AB", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -1322,18 +1331,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "vpcFrompropsECRAPIsecuritygroupB070D1AB", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1345,12 +1342,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "vpcFrompropsECRDKRsecuritygroup4D8AFEF5", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -1363,18 +1372,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "vpcFrompropsECRDKRsecuritygroup4D8AFEF5", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1386,27 +1383,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -1427,7 +1412,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "vpcFrompropsKINESISFIREHOSEsecuritygroup537BDD19": { @@ -1730,6 +1730,11 @@ "Ref": "testfargatekinesisstreamsclusterEA5A2AD7" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1764,110 +1769,11 @@ "TaskDefinition": { "Ref": "testfargatekinesisstreamstaskdef402FE0B3" } - } - } - }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } + "DependsOn": [ + "testfargatekinesisstreamstaskdefTaskRoleDefaultPolicyAE7EF3E4", + "testfargatekinesisstreamstaskdefTaskRole9811F3BE" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json index 810cc8994..94ad4f26a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json @@ -18,9 +18,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -37,7 +34,10 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -53,15 +53,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -78,12 +78,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -105,15 +105,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -129,9 +129,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -148,7 +145,10 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -164,15 +164,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -189,12 +189,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -216,15 +216,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -240,9 +240,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -259,7 +256,10 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -275,15 +275,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -300,12 +300,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -327,15 +327,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -351,9 +351,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -370,21 +367,24 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -401,21 +401,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -432,21 +429,24 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -463,21 +463,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -494,21 +491,24 @@ "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingFargateService/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -525,12 +525,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -548,11 +548,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "existingFargateService/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "existingFargateService/Vpc/FlowLog" } ] }, @@ -646,10 +646,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -660,10 +656,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "existingFargateService/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -672,6 +672,15 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingFargateServiceECRAPIsecuritygroup5EE2643E", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -684,18 +693,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingFargateServiceECRAPIsecuritygroup5EE2643E", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -707,12 +704,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingFargateServiceECRDKRsecuritygroup41F182BE", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -725,18 +734,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingFargateServiceECRDKRsecuritygroup41F182BE", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -748,27 +745,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -789,12 +774,6 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" - } - }, - "VpcKINESISSTREAMSC07D91B5": { - "Type": "AWS::EC2::VPCEndpoint", - "Properties": { "ServiceName": { "Fn::Join": [ "", @@ -803,13 +782,19 @@ { "Ref": "AWS::Region" }, - ".kinesis-streams" + ".s3" ] ] }, + "VpcEndpointType": "Gateway", "VpcId": { "Ref": "Vpc8378EB38" - }, + } + } + }, + "VpcKINESISSTREAMSC07D91B5": { + "Type": "AWS::EC2::VPCEndpoint", + "Properties": { "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -819,6 +804,18 @@ ] } ], + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".kinesis-streams" + ] + ] + }, "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -830,7 +827,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "existingFargateServiceECRAPIsecuritygroup5EE2643E": { @@ -1076,6 +1076,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1110,7 +1115,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] }, "testfargatekinesisstreamsKinesisStreamD31BD614": { "Type": "AWS::Kinesis::Stream", @@ -1126,9 +1135,9 @@ "testfargatekinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarm60755E90": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -1139,9 +1148,9 @@ "testfargatekinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarmDE16A9F2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingStream.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingStream.expected.json index c11f84f5e..28cff9b56 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingStream.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingStream.expected.json @@ -16,9 +16,9 @@ "testfargatekinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarm60755E90": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -29,9 +29,9 @@ "testfargatekinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarmDE16A9F2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -57,9 +57,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -76,7 +73,10 @@ "Key": "Name", "Value": "existingStream/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -92,15 +92,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingStream/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -117,12 +117,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -144,15 +144,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -168,9 +168,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -187,7 +184,10 @@ "Key": "Name", "Value": "existingStream/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -203,15 +203,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingStream/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -228,12 +228,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -255,15 +255,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -279,9 +279,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -298,7 +295,10 @@ "Key": "Name", "Value": "existingStream/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -314,15 +314,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingStream/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -339,12 +339,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -366,15 +366,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -390,9 +390,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -409,21 +406,24 @@ "Key": "Name", "Value": "existingStream/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingStream/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -440,21 +440,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -471,21 +468,24 @@ "Key": "Name", "Value": "existingStream/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingStream/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -502,21 +502,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -533,21 +530,24 @@ "Key": "Name", "Value": "existingStream/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingStream/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -564,12 +564,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -587,11 +587,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -613,7 +613,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc" + "Value": "existingStream/Vpc/FlowLog" } ] } @@ -665,7 +665,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc" + "Value": "existingStream/Vpc/FlowLog" } ] }, @@ -685,10 +685,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -699,10 +695,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc" + "Value": "existingStream/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -711,6 +711,15 @@ "VpcKINESISSTREAMSC07D91B5": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingStreamKINESISSTREAMSsecuritygroup14C04A5F", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -723,18 +732,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingStreamKINESISSTREAMSsecuritygroup14C04A5F", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -746,12 +743,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingStreamECRAPIsecuritygroup4E9C019E", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -764,18 +773,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingStreamECRAPIsecuritygroup4E9C019E", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -787,12 +784,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingStreamECRDKRsecuritygroup5C8931AB", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -805,18 +814,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingStreamECRDKRsecuritygroup5C8931AB", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -828,27 +825,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -869,7 +854,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "existingStreamKINESISSTREAMSsecuritygroup14C04A5F": { @@ -1173,6 +1173,11 @@ "Ref": "testfargatekinesisstreamsclusterEA5A2AD7" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1207,7 +1212,11 @@ "TaskDefinition": { "Ref": "testfargatekinesisstreamstaskdef402FE0B3" } - } + }, + "DependsOn": [ + "testfargatekinesisstreamstaskdefTaskRoleDefaultPolicyAE7EF3E4", + "testfargatekinesisstreamstaskdefTaskRole9811F3BE" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json index bc14d2b5a..b5492ad94 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json @@ -18,9 +18,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -37,7 +34,10 @@ "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -53,15 +53,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -78,12 +78,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -105,15 +105,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -129,9 +129,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -148,7 +145,10 @@ "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -164,15 +164,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -189,12 +189,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -216,15 +216,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -240,9 +240,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -259,7 +256,10 @@ "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -275,15 +275,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -300,12 +300,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -327,15 +327,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -351,9 +351,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -370,21 +367,24 @@ "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -401,21 +401,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -432,21 +429,24 @@ "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -463,21 +463,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -494,21 +491,24 @@ "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -525,12 +525,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -548,11 +548,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "existingVpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "existingVpc/Vpc/FlowLog" } ] }, @@ -646,10 +646,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -660,10 +656,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "existingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -672,6 +672,15 @@ "VpcKINESISSTREAMSC07D91B5": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingVpcKINESISSTREAMSsecuritygroupDE0E9DB9", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -684,18 +693,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingVpcKINESISSTREAMSsecuritygroupDE0E9DB9", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -707,12 +704,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingVpcECRAPIsecuritygroupB3E4A376", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -725,18 +734,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingVpcECRAPIsecuritygroupB3E4A376", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -748,12 +745,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingVpcECRDKRsecuritygroup0500FAE6", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -766,18 +775,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingVpcECRDKRsecuritygroup0500FAE6", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -789,27 +786,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -830,7 +815,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testfargatekinesisstreamsKinesisStreamD31BD614": { @@ -847,9 +847,9 @@ "testfargatekinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarm60755E90": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -860,9 +860,9 @@ "testfargatekinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarmDE16A9F2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -1171,6 +1171,11 @@ "Ref": "testfargatekinesisstreamsclusterEA5A2AD7" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1205,7 +1210,11 @@ "TaskDefinition": { "Ref": "testfargatekinesisstreamstaskdef402FE0B3" } - } + }, + "DependsOn": [ + "testfargatekinesisstreamstaskdefTaskRoleDefaultPolicyAE7EF3E4", + "testfargatekinesisstreamstaskdefTaskRole9811F3BE" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json index b24e7d147..c5d5c91b5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json @@ -14,9 +14,9 @@ "testfargatekinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarm60755E90": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -27,9 +27,9 @@ "testfargatekinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarmDE16A9F2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -55,9 +55,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -74,7 +71,10 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -90,15 +90,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -115,12 +115,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -142,15 +142,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -166,9 +166,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -185,7 +182,10 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -201,15 +201,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -226,12 +226,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -253,15 +253,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -277,9 +277,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -296,7 +293,10 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -312,15 +312,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -337,12 +337,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -364,15 +364,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -388,9 +388,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -407,21 +404,24 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -438,21 +438,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -469,21 +466,24 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -500,21 +500,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -531,21 +528,24 @@ "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "fargateServiceFromProps/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -562,12 +562,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -585,11 +585,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -611,7 +611,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "fargateServiceFromProps/Vpc/FlowLog" } ] } @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "fargateServiceFromProps/Vpc/FlowLog" } ] }, @@ -683,10 +683,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -697,10 +693,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "fargateServiceFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -709,6 +709,15 @@ "VpcKINESISSTREAMSC07D91B5": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "fargateServiceFromPropsKINESISSTREAMSsecuritygroup6FD7F225", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -721,18 +730,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "fargateServiceFromPropsKINESISSTREAMSsecuritygroup6FD7F225", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -744,12 +741,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "fargateServiceFromPropsECRAPIsecuritygroup5784F80B", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -762,18 +771,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "fargateServiceFromPropsECRAPIsecuritygroup5784F80B", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -785,12 +782,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "fargateServiceFromPropsECRDKRsecuritygroup9E1C301F", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -803,18 +812,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "fargateServiceFromPropsECRDKRsecuritygroup9E1C301F", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -826,27 +823,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -867,7 +852,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "fargateServiceFromPropsKINESISSTREAMSsecuritygroup6FD7F225": { @@ -1171,6 +1171,11 @@ "Ref": "testfargatekinesisstreamsclusterEA5A2AD7" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1206,7 +1211,11 @@ "TaskDefinition": { "Ref": "testfargatekinesisstreamstaskdef402FE0B3" } - } + }, + "DependsOn": [ + "testfargatekinesisstreamstaskdefTaskRoleDefaultPolicyAE7EF3E4", + "testfargatekinesisstreamstaskdefTaskRole9811F3BE" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json index 62dd5c4b3..6b84aee7b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json @@ -14,9 +14,9 @@ "testfargatekinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarm60755E90": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -27,9 +27,9 @@ "testfargatekinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarmDE16A9F2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -55,9 +55,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -74,7 +71,10 @@ "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -90,15 +90,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -115,12 +115,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -142,15 +142,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -166,9 +166,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -185,7 +182,10 @@ "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -201,15 +201,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -226,12 +226,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -253,15 +253,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -277,9 +277,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -296,7 +293,10 @@ "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -312,15 +312,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -337,12 +337,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -364,15 +364,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -388,9 +388,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -407,21 +404,24 @@ "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -438,21 +438,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -469,21 +466,24 @@ "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -500,21 +500,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -531,21 +528,24 @@ "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "noArguments/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -562,12 +562,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -585,11 +585,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -611,7 +611,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "noArguments/Vpc/FlowLog" } ] } @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "noArguments/Vpc/FlowLog" } ] }, @@ -683,10 +683,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -697,10 +693,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "noArguments/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -709,6 +709,15 @@ "VpcKINESISSTREAMSC07D91B5": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "noArgumentsKINESISSTREAMSsecuritygroupA5FDBE79", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -721,18 +730,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "noArgumentsKINESISSTREAMSsecuritygroupA5FDBE79", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -744,12 +741,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "noArgumentsECRAPIsecuritygroup70B67825", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -762,18 +771,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "noArgumentsECRAPIsecuritygroup70B67825", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -785,12 +782,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "noArgumentsECRDKRsecuritygroup881C3744", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -803,18 +812,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "noArgumentsECRDKRsecuritygroup881C3744", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -826,27 +823,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -867,7 +852,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "noArgumentsKINESISSTREAMSsecuritygroupA5FDBE79": { @@ -1171,6 +1171,11 @@ "Ref": "testfargatekinesisstreamsclusterEA5A2AD7" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1205,7 +1210,11 @@ "TaskDefinition": { "Ref": "testfargatekinesisstreamstaskdef402FE0B3" } - } + }, + "DependsOn": [ + "testfargatekinesisstreamstaskdefTaskRoleDefaultPolicyAE7EF3E4", + "testfargatekinesisstreamstaskdefTaskRole9811F3BE" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.streamFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.streamFromProps.expected.json index 58bee13d3..1e6781fb8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.streamFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.streamFromProps.expected.json @@ -16,9 +16,9 @@ "testfargatekinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarm60755E90": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -29,9 +29,9 @@ "testfargatekinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarmDE16A9F2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -57,9 +57,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -76,7 +73,10 @@ "Key": "Name", "Value": "streamFromProps/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -92,15 +92,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "streamFromProps/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -117,12 +117,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -144,15 +144,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -168,9 +168,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -187,7 +184,10 @@ "Key": "Name", "Value": "streamFromProps/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -203,15 +203,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "streamFromProps/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -228,12 +228,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -255,15 +255,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -279,9 +279,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -298,7 +295,10 @@ "Key": "Name", "Value": "streamFromProps/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -314,15 +314,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "streamFromProps/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -339,12 +339,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -366,15 +366,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -390,9 +390,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -409,21 +406,24 @@ "Key": "Name", "Value": "streamFromProps/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "streamFromProps/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -440,21 +440,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -471,21 +468,24 @@ "Key": "Name", "Value": "streamFromProps/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "streamFromProps/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -502,21 +502,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -533,21 +530,24 @@ "Key": "Name", "Value": "streamFromProps/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "streamFromProps/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -564,12 +564,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -587,11 +587,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -613,7 +613,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc" + "Value": "streamFromProps/Vpc/FlowLog" } ] } @@ -665,7 +665,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc" + "Value": "streamFromProps/Vpc/FlowLog" } ] }, @@ -685,10 +685,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -699,10 +695,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc" + "Value": "streamFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -711,6 +711,15 @@ "VpcKINESISSTREAMSC07D91B5": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "streamFromPropsKINESISSTREAMSsecuritygroup68986EDF", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -723,18 +732,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "streamFromPropsKINESISSTREAMSsecuritygroup68986EDF", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -746,12 +743,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "streamFromPropsECRAPIsecuritygroupFDB580C0", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -764,18 +773,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "streamFromPropsECRAPIsecuritygroupFDB580C0", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -787,12 +784,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "streamFromPropsECRDKRsecuritygroupEB1BC2F0", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -805,18 +814,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "streamFromPropsECRDKRsecuritygroupEB1BC2F0", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -828,27 +825,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -869,7 +854,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "streamFromPropsKINESISSTREAMSsecuritygroup68986EDF": { @@ -1173,6 +1173,11 @@ "Ref": "testfargatekinesisstreamsclusterEA5A2AD7" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1207,7 +1212,11 @@ "TaskDefinition": { "Ref": "testfargatekinesisstreamstaskdef402FE0B3" } - } + }, + "DependsOn": [ + "testfargatekinesisstreamstaskdefTaskRoleDefaultPolicyAE7EF3E4", + "testfargatekinesisstreamstaskdefTaskRole9811F3BE" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json index d12c25b61..9532f7b9d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json @@ -14,9 +14,9 @@ "testfargatekinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarm60755E90": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -27,9 +27,9 @@ "testfargatekinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarmDE16A9F2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -55,9 +55,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.100.0.0/19", "MapPublicIpOnLaunch": true, @@ -74,7 +71,10 @@ "Key": "Name", "Value": "vpcFromProps/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -90,15 +90,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromProps/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -115,12 +115,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -142,15 +142,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -166,9 +166,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.100.32.0/19", "MapPublicIpOnLaunch": true, @@ -185,7 +182,10 @@ "Key": "Name", "Value": "vpcFromProps/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -201,15 +201,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromProps/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -226,12 +226,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -253,15 +253,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -277,9 +277,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.100.64.0/19", "MapPublicIpOnLaunch": true, @@ -296,7 +293,10 @@ "Key": "Name", "Value": "vpcFromProps/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -312,15 +312,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromProps/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -337,12 +337,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -364,15 +364,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -388,9 +388,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.100.96.0/19", "MapPublicIpOnLaunch": false, @@ -407,21 +404,24 @@ "Key": "Name", "Value": "vpcFromProps/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromProps/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -438,21 +438,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.100.128.0/19", "MapPublicIpOnLaunch": false, @@ -469,21 +466,24 @@ "Key": "Name", "Value": "vpcFromProps/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromProps/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -500,21 +500,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.100.160.0/19", "MapPublicIpOnLaunch": false, @@ -531,21 +528,24 @@ "Key": "Name", "Value": "vpcFromProps/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpcFromProps/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -562,12 +562,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -585,11 +585,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -611,7 +611,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc" + "Value": "vpcFromProps/Vpc/FlowLog" } ] } @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc" + "Value": "vpcFromProps/Vpc/FlowLog" } ] }, @@ -683,10 +683,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -697,10 +693,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc" + "Value": "vpcFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -709,6 +709,15 @@ "VpcKINESISSTREAMSC07D91B5": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "vpcFromPropsKINESISSTREAMSsecuritygroupB4A9EE00", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -721,18 +730,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "vpcFromPropsKINESISSTREAMSsecuritygroupB4A9EE00", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -744,12 +741,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "vpcFromPropsECRAPIsecuritygroup5AF6C0C4", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -762,18 +771,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "vpcFromPropsECRAPIsecuritygroup5AF6C0C4", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -785,12 +782,24 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "vpcFromPropsECRDKRsecuritygroup822718EC", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -803,18 +812,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "vpcFromPropsECRDKRsecuritygroup822718EC", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -826,27 +823,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -867,7 +852,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "vpcFromPropsKINESISSTREAMSsecuritygroupB4A9EE00": { @@ -1171,6 +1171,11 @@ "Ref": "testfargatekinesisstreamsclusterEA5A2AD7" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1205,7 +1210,11 @@ "TaskDefinition": { "Ref": "testfargatekinesisstreamstaskdef402FE0B3" } - } + }, + "DependsOn": [ + "testfargatekinesisstreamstaskdefTaskRoleDefaultPolicyAE7EF3E4", + "testfargatekinesisstreamstaskdefTaskRole9811F3BE" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json index 7fcf875da..4e43f850b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] }, @@ -647,10 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -661,10 +657,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -673,10 +673,6 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,7 +753,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "existingresourcesECRAPIsecuritygroup78294485": { @@ -987,6 +987,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1021,7 +1026,10 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleB2DEF113" + ] }, "testconstructCognitoUserPoolA4991355": { "Type": "AWS::Cognito::UserPool", @@ -1060,9 +1068,6 @@ "testconstructCognitoUserPoolClient36ACF012": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testconstructCognitoUserPoolA4991355" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -1080,7 +1085,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testconstructCognitoUserPoolA4991355" + } } }, "testconstructCognitoIdentityPool51EFD08D": { @@ -1431,9 +1439,9 @@ "testconstructStatusRedAlarmFBEA96DF": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -1444,9 +1452,9 @@ "testconstructStatusYellowAlarm3B8C3640": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -1457,9 +1465,9 @@ "testconstructFreeStorageSpaceTooLowAlarm08294658": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -1470,9 +1478,9 @@ "testconstructIndexWritesBlockedTooHighAlarm06094A18": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -1483,9 +1491,9 @@ "testconstructAutomatedSnapshotFailureTooHighAlarm29E550A3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -1496,9 +1504,9 @@ "testconstructCPUUtilizationTooHighAlarmD32179B7": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -1509,9 +1517,9 @@ "testconstructJVMMemoryPressureTooHighAlarmFD4175A0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -1522,9 +1530,9 @@ "testconstructMasterCPUUtilizationTooHighAlarmAA50D0A7": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -1535,9 +1543,9 @@ "testconstructMasterJVMMemoryPressureTooHighAlarm5AE37D64": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json index d29d2ac1d..1887e8c57 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json @@ -38,9 +38,6 @@ "testconstructCognitoUserPoolClient36ACF012": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testconstructCognitoUserPoolA4991355" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -58,7 +55,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testconstructCognitoUserPoolA4991355" + } } }, "testconstructCognitoIdentityPool51EFD08D": { @@ -409,9 +409,9 @@ "testconstructStatusRedAlarmFBEA96DF": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -422,9 +422,9 @@ "testconstructStatusYellowAlarm3B8C3640": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -435,9 +435,9 @@ "testconstructFreeStorageSpaceTooLowAlarm08294658": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -448,9 +448,9 @@ "testconstructIndexWritesBlockedTooHighAlarm06094A18": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -461,9 +461,9 @@ "testconstructAutomatedSnapshotFailureTooHighAlarm29E550A3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -474,9 +474,9 @@ "testconstructCPUUtilizationTooHighAlarmD32179B7": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -487,9 +487,9 @@ "testconstructJVMMemoryPressureTooHighAlarmFD4175A0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -500,9 +500,9 @@ "testconstructMasterCPUUtilizationTooHighAlarmAA50D0A7": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -513,9 +513,9 @@ "testconstructMasterJVMMemoryPressureTooHighAlarm5AE37D64": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -541,9 +541,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -560,7 +557,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -576,15 +576,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -601,12 +601,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -628,15 +628,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -652,9 +652,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -671,7 +668,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -687,15 +687,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -712,12 +712,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -739,15 +739,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -763,9 +763,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -782,7 +779,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -798,15 +798,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -823,12 +823,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -850,15 +850,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -874,9 +874,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -893,21 +890,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -924,21 +924,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -955,21 +952,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -986,21 +986,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -1017,21 +1014,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -1048,12 +1048,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -1071,11 +1071,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -1097,7 +1097,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] } @@ -1149,7 +1149,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] }, @@ -1169,10 +1169,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1183,10 +1179,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1195,10 +1195,6 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -1208,6 +1204,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1219,16 +1216,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -1238,6 +1234,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1249,27 +1246,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -1290,7 +1275,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newresourcesECRAPIsecuritygroupE52BAE3F": { @@ -1509,6 +1509,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1543,7 +1548,10 @@ "TaskDefinition": { "Ref": "testconstructtaskdef8BD1F9E4" } - } + }, + "DependsOn": [ + "testconstructtaskdefTaskRoleC60414C4" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json index 9f38728ad..60e51ad86 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] }, @@ -647,10 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -661,10 +657,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -673,10 +673,6 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,7 +753,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "scrapBucketB11863B7": { @@ -913,18 +913,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -1276,6 +1276,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1310,7 +1315,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json index 33929811a..df29641ff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json @@ -290,9 +290,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -309,7 +306,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -325,15 +325,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -350,12 +350,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -377,15 +377,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -401,9 +401,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -420,7 +417,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -436,15 +436,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -461,12 +461,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -488,15 +488,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -512,9 +512,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -531,7 +528,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -547,15 +547,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -572,12 +572,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -599,15 +599,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -623,9 +623,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -642,21 +639,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -673,21 +673,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -704,21 +701,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -735,21 +735,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -766,21 +763,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -797,12 +797,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -820,11 +820,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -846,7 +846,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] } @@ -898,7 +898,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] }, @@ -918,10 +918,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -932,10 +928,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -944,21 +944,6 @@ "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -979,16 +964,27 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -998,6 +994,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1009,16 +1006,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -1028,6 +1024,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1039,7 +1036,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newresourcesECRAPIsecuritygroupE52BAE3F": { @@ -1313,6 +1313,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1347,7 +1352,11 @@ "TaskDefinition": { "Ref": "testconstructtaskdef8BD1F9E4" } - } + }, + "DependsOn": [ + "testconstructtaskdefTaskRoleDefaultPolicyF34A1535", + "testconstructtaskdefTaskRoleC60414C4" + ] }, "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { "Type": "AWS::IAM::Role", @@ -1378,18 +1387,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.expected.json index e715fe90d..9355051e6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,21 +657,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,16 +753,27 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcSECRETSMANAGERF52907C2": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.secretsmanager", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -787,6 +783,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.secretsmanager", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -798,7 +795,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "secret4DA88516": { @@ -1058,6 +1058,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1092,7 +1097,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] }, "existingresourcesSECRETSMANAGERsecuritygroup8010FC5B": { "Type": "AWS::EC2::SecurityGroup", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.new-resources.expected.json index a447faa0c..f893bb048 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.new-resources.expected.json @@ -37,9 +37,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -56,7 +53,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -72,15 +72,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -97,12 +97,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -124,15 +124,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -148,9 +148,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -167,7 +164,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -183,15 +183,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -208,12 +208,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -235,15 +235,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -259,9 +259,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -278,7 +275,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -294,15 +294,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -319,12 +319,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -346,15 +346,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -370,9 +370,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -389,21 +386,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -420,21 +420,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -451,21 +448,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -482,21 +482,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -513,21 +510,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -544,12 +544,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -567,11 +567,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -593,7 +593,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] } @@ -645,7 +645,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] }, @@ -665,11 +665,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -680,21 +675,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSECRETSMANAGERF52907C2": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.secretsmanager", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -704,6 +700,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.secretsmanager", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -715,16 +712,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -734,6 +730,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -745,16 +742,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -764,6 +760,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -775,27 +772,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -816,7 +801,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newresourcesSECRETSMANAGERsecuritygroupD22DA6BC": { @@ -1126,6 +1126,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1160,7 +1165,11 @@ "TaskDefinition": { "Ref": "testconstructtaskdef8BD1F9E4" } - } + }, + "DependsOn": [ + "testconstructtaskdefTaskRoleDefaultPolicyF34A1535", + "testconstructtaskdefTaskRoleC60414C4" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json index 72900b528..1f5c9d097 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,21 +657,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,16 +753,27 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcSNS5B664381": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.sns", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -787,6 +783,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.sns", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -798,7 +795,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testtopicB3D54793": { @@ -1059,6 +1059,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1093,7 +1098,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] }, "existingresourcesSNSsecuritygroup2696BE98": { "Type": "AWS::EC2::SecurityGroup", @@ -1188,4 +1197,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.new-resources.expected.json index bfc2f4231..ee0a2e6b2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.new-resources.expected.json @@ -124,9 +124,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -143,7 +140,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -159,15 +159,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -184,12 +184,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -211,15 +211,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -235,9 +235,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -254,7 +251,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -270,15 +270,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -295,12 +295,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -322,15 +322,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -346,9 +346,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -365,7 +362,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -381,15 +381,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -406,12 +406,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -433,15 +433,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -457,9 +457,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -476,21 +473,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -507,21 +507,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -538,21 +535,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -569,21 +569,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -600,21 +597,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -631,12 +631,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -654,11 +654,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -680,7 +680,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] } @@ -732,7 +732,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] }, @@ -752,11 +752,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -767,21 +762,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSNS5B664381": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.sns", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -791,6 +787,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.sns", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -802,16 +799,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -821,6 +817,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -832,16 +829,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -851,6 +847,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -862,27 +859,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -903,7 +888,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newresourcesSNSsecuritygroup4422F7B8": { @@ -1209,6 +1209,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1243,7 +1248,11 @@ "TaskDefinition": { "Ref": "testconstructtaskdef8BD1F9E4" } - } + }, + "DependsOn": [ + "testconstructtaskdefTaskRoleDefaultPolicyF34A1535", + "testconstructtaskdefTaskRoleC60414C4" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.expected.json index 3983feb0d..3e6aae42c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,21 +657,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,16 +753,27 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcSQSDF166A88": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.sqs", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -787,6 +783,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.sqs", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -798,7 +795,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testqueueA58C838B": { @@ -1078,6 +1078,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1112,7 +1117,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] }, "existingresourcesSQSsecuritygroup0C9178B2": { "Type": "AWS::EC2::SecurityGroup", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.new-resources.expected.json index d8a901ff8..b2fe8831d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.new-resources.expected.json @@ -99,9 +99,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -118,7 +115,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -134,15 +134,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -159,12 +159,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -186,15 +186,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -210,9 +210,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -229,7 +226,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -245,15 +245,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -270,12 +270,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -297,15 +297,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -321,9 +321,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -340,7 +337,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -356,15 +356,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -381,12 +381,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -408,15 +408,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -432,9 +432,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -451,21 +448,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -482,21 +482,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -513,21 +510,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -544,21 +544,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -575,21 +572,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -606,12 +606,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -629,11 +629,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -655,7 +655,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] } @@ -707,7 +707,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] }, @@ -727,11 +727,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -742,21 +737,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSQSDF166A88": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.sqs", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -766,6 +762,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.sqs", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -777,16 +774,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -796,6 +792,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -807,16 +804,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -826,6 +822,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -837,27 +834,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -878,7 +863,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newresourcesSQSsecuritygroup1D95FDB1": { @@ -1191,6 +1191,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1225,7 +1230,11 @@ "TaskDefinition": { "Ref": "testconstructtaskdef8BD1F9E4" } - } + }, + "DependsOn": [ + "testconstructtaskdefTaskRoleDefaultPolicyF34A1535", + "testconstructtaskdefTaskRoleC60414C4" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.expected.json index dffa1b1c6..a02651ced 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,21 +657,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "existing-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,16 +753,27 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcSSM173B3B5B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ssm", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -787,6 +783,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ssm", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -798,17 +795,20 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "Parameter9E1B4FBA": { "Type": "AWS::SSM::Parameter", "Properties": { - "Type": "String", - "Value": "Foo", "AllowedPattern": ".*", "Description": "The value Foo", - "Name": "FooParameter" + "Name": "FooParameter", + "Type": "String", + "Value": "Foo" } }, "existingresourcesECRAPIsecuritygroup78294485": { @@ -1091,6 +1091,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1125,7 +1130,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] }, "existingresourcesSSMsecuritygroup5CE82B38": { "Type": "AWS::EC2::SecurityGroup", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.new-resources.expected.json index 57b7aa520..8b5a629be 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.new-resources.expected.json @@ -4,9 +4,9 @@ "testconstructstringParameter4A9E7765": { "Type": "AWS::SSM::Parameter", "Properties": { + "Name": "FooParameter", "Type": "String", - "Value": "Foo", - "Name": "FooParameter" + "Value": "Foo" } }, "Vpc8378EB38": { @@ -27,9 +27,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -46,7 +43,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -62,15 +62,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -87,12 +87,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -114,15 +114,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -138,9 +138,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -157,7 +154,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -173,15 +173,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -198,12 +198,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -225,15 +225,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -249,9 +249,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -268,7 +265,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -284,15 +284,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -309,12 +309,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -336,15 +336,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -360,9 +360,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -379,21 +376,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -410,21 +410,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -441,21 +438,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -472,21 +472,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -503,21 +500,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -534,12 +534,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -557,11 +557,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -583,7 +583,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] } @@ -635,7 +635,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] }, @@ -655,11 +655,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -670,21 +665,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSSM173B3B5B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ssm", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -694,6 +690,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ssm", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -705,16 +702,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -724,6 +720,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -735,16 +732,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -754,6 +750,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -765,27 +762,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -806,7 +791,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newresourcesSSMsecuritygroupBA8A3B0D": { @@ -1124,6 +1124,11 @@ "Ref": "testconstructcluster7B6231C5" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1158,7 +1163,11 @@ "TaskDefinition": { "Ref": "testconstructtaskdef8BD1F9E4" } - } + }, + "DependsOn": [ + "testconstructtaskdefTaskRoleDefaultPolicyF34A1535", + "testconstructtaskdefTaskRoleC60414C4" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json index f8b2fa26e..b220c2404 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-resources/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ] }, @@ -647,10 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -661,10 +657,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -673,10 +673,6 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,16 +753,27 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcSTEPFUNCTIONS550F8CB6": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.states", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -787,6 +783,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.states", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -798,7 +795,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newresourcesECRAPIsecuritygroupE52BAE3F": { @@ -1037,6 +1037,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1071,7 +1076,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] }, "testconstructStateMachineLogGroup2EB4F48B": { "Type": "AWS::Logs::LogGroup", @@ -1200,12 +1209,6 @@ "testconstructStateMachine3333AAA9": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "testconstructStateMachineRoleA396E5D3", - "Arn" - ] - }, "DefinitionString": "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"End\":true}}}", "LoggingConfiguration": { "Destinations": [ @@ -1221,6 +1224,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "testconstructStateMachineRoleA396E5D3", + "Arn" + ] } }, "DependsOn": [ @@ -1233,9 +1242,8 @@ "testconstructExecutionFailedAlarmE9CEA29E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -1244,6 +1252,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -1254,9 +1263,8 @@ "testconstructExecutionThrottledAlarmEE993A2A": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -1265,6 +1273,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -1275,9 +1284,8 @@ "testconstructExecutionAbortedAlarm2BC3DDB8": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -1286,6 +1294,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.expected.json index 8da9fc9df..2d6f8627b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc" + "Value": "no-cloudwatch-alarms/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc" + "Value": "no-cloudwatch-alarms/Vpc/FlowLog" } ] }, @@ -647,10 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -661,10 +657,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc" + "Value": "no-cloudwatch-alarms/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -673,10 +673,6 @@ "VpcECRAPI9A3B6A2B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.api", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -686,6 +682,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.api", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -697,16 +694,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcECRDKR604E039F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -716,6 +712,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.ecr.dkr", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -727,27 +724,15 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".s3" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -768,16 +753,27 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".s3" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcSTEPFUNCTIONS550F8CB6": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": "com.amazonaws.us-east-1.states", - "VpcId": { - "Ref": "Vpc8378EB38" - }, "PrivateDnsEnabled": true, "SecurityGroupIds": [ { @@ -787,6 +783,7 @@ ] } ], + "ServiceName": "com.amazonaws.us-east-1.states", "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -798,7 +795,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "nocloudwatchalarmsECRAPIsecuritygroupA72029F8": { @@ -1037,6 +1037,11 @@ "Ref": "testclusterDF8B0D19" }, "DeploymentConfiguration": { + "Alarms": { + "AlarmNames": [], + "Enable": false, + "Rollback": false + }, "MaximumPercent": 150, "MinimumHealthyPercent": 75 }, @@ -1071,7 +1076,11 @@ "TaskDefinition": { "Ref": "testtaskdefF924AD58" } - } + }, + "DependsOn": [ + "testtaskdefTaskRoleDefaultPolicy5D591D1C", + "testtaskdefTaskRoleB2DEF113" + ] }, "testconstructStateMachineLogGroup2EB4F48B": { "Type": "AWS::Logs::LogGroup", @@ -1180,12 +1189,6 @@ "testconstructStateMachine3333AAA9": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "testconstructStateMachineRoleA396E5D3", - "Arn" - ] - }, "DefinitionString": "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"End\":true}}}", "LoggingConfiguration": { "Destinations": [ @@ -1201,6 +1204,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "testconstructStateMachineRoleA396E5D3", + "Arn" + ] } }, "DependsOn": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json index c0e6aca1f..60fbe3fb2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json @@ -126,12 +126,6 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "testiotlambdadynamodbstackLambdaToDynamoDBLambdaFunctionServiceRole31915E05", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -141,6 +135,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testiotlambdadynamodbstackLambdaToDynamoDBLambdaFunctionServiceRole31915E05", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -191,19 +191,19 @@ "testiotlambdadynamodbstackLambdaToDynamoDBDynamoTableE17E5733": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json index acab0fcdd..5b46748dc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json @@ -167,12 +167,6 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "testiotlambdadynamodbstackLambdaToDynamoDBLambdaFunctionServiceRole31915E05", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -182,6 +176,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testiotlambdadynamodbstackLambdaToDynamoDBLambdaFunctionServiceRole31915E05", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -261,19 +261,19 @@ "testiotlambdadynamodbstackLambdaToDynamoDBDynamoTableE17E5733": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -302,9 +302,6 @@ "testiotlambdadynamodbstackVpcisolatedSubnet1Subnet3AB7ADA5": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "testiotlambdadynamodbstackVpc1986A4BB" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -321,21 +318,24 @@ "Key": "Name", "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "testiotlambdadynamodbstackVpc1986A4BB" + } } }, "testiotlambdadynamodbstackVpcisolatedSubnet1RouteTableE28AAAB5": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "testiotlambdadynamodbstackVpc1986A4BB" - }, "Tags": [ { "Key": "Name", "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "testiotlambdadynamodbstackVpc1986A4BB" + } } }, "testiotlambdadynamodbstackVpcisolatedSubnet1RouteTableAssociationFAA18521": { @@ -352,9 +352,6 @@ "testiotlambdadynamodbstackVpcisolatedSubnet2SubnetBDEE1FAE": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "testiotlambdadynamodbstackVpc1986A4BB" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "testiotlambdadynamodbstackVpc1986A4BB" + } } }, "testiotlambdadynamodbstackVpcisolatedSubnet2RouteTableAF607A65": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "testiotlambdadynamodbstackVpc1986A4BB" - }, "Tags": [ { "Key": "Name", "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "testiotlambdadynamodbstackVpc1986A4BB" + } } }, "testiotlambdadynamodbstackVpcisolatedSubnet2RouteTableAssociation80ECEB84": { @@ -402,9 +402,6 @@ "testiotlambdadynamodbstackVpcisolatedSubnet3Subnet5D41F483": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "testiotlambdadynamodbstackVpc1986A4BB" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -421,21 +418,24 @@ "Key": "Name", "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "testiotlambdadynamodbstackVpc1986A4BB" + } } }, "testiotlambdadynamodbstackVpcisolatedSubnet3RouteTableE56B664A": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "testiotlambdadynamodbstackVpc1986A4BB" - }, "Tags": [ { "Key": "Name", "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "testiotlambdadynamodbstackVpc1986A4BB" + } } }, "testiotlambdadynamodbstackVpcisolatedSubnet3RouteTableAssociationF06E774F": { @@ -467,7 +467,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc" + "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/FlowLog" } ] } @@ -519,7 +519,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc" + "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/FlowLog" } ] }, @@ -539,10 +539,6 @@ "testiotlambdadynamodbstackVpcFlowLogC88B17DB": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "testiotlambdadynamodbstackVpc1986A4BB" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "testiotlambdadynamodbstackVpcFlowLogIAMRole84CD262B", @@ -553,10 +549,14 @@ "LogGroupName": { "Ref": "testiotlambdadynamodbstackVpcFlowLogLogGroup0BA54CDB" }, + "ResourceId": { + "Ref": "testiotlambdadynamodbstackVpc1986A4BB" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc" + "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -565,6 +565,17 @@ "testiotlambdadynamodbstackVpcDDBD215AB1B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "RouteTableIds": [ + { + "Ref": "testiotlambdadynamodbstackVpcisolatedSubnet1RouteTableE28AAAB5" + }, + { + "Ref": "testiotlambdadynamodbstackVpcisolatedSubnet2RouteTableAF607A65" + }, + { + "Ref": "testiotlambdadynamodbstackVpcisolatedSubnet3RouteTableE56B664A" + } + ], "ServiceName": { "Fn::Join": [ "", @@ -577,21 +588,10 @@ ] ] }, + "VpcEndpointType": "Gateway", "VpcId": { "Ref": "testiotlambdadynamodbstackVpc1986A4BB" - }, - "RouteTableIds": [ - { - "Ref": "testiotlambdadynamodbstackVpcisolatedSubnet1RouteTableE28AAAB5" - }, - { - "Ref": "testiotlambdadynamodbstackVpcisolatedSubnet2RouteTableAF607A65" - }, - { - "Ref": "testiotlambdadynamodbstackVpcisolatedSubnet3RouteTableE56B664A" - } - ], - "VpcEndpointType": "Gateway" + } } }, "testiotlambdadynamodbstackIotToLambdaIotTopic74F5E3BB": { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json index 42fd24970..1966d0657 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json @@ -98,18 +98,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "testiotlambdaintegrationLambdaFunctionServiceRole27C3EE41", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testiotlambdaintegrationLambdaFunctionServiceRole27C3EE41", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json index 9026e8587..ae6e70b8a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json @@ -98,18 +98,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json index 8f8b07b38..423e55a0f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json @@ -142,18 +142,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -283,109 +283,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json index 95a67bf11..c447bea63 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json @@ -3,6 +3,7 @@ "existingKeyB52D6AF1": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -30,8 +31,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json index 293bda90e..ffb38796f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json @@ -143,18 +143,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -398,109 +398,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json index 1d092a359..cd3ca176d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json @@ -179,18 +179,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -567,109 +567,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json index 2c7f16e68..81b1bf65b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json @@ -422,12 +422,6 @@ "Fn::Sub": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/fbf0b12f00bc09401fb04a361c549193f18f6fa7df4d304c5bfab7ace478b340.py" } }, - "Role": { - "Fn::GetAtt": [ - "testkinesisstreamslambdaJobRole42199B9C", - "Arn" - ] - }, "DefaultArguments": { "--enable-metrics": true, "--enable-continuous-cloudwatch-log": true, @@ -452,6 +446,12 @@ }, "GlueVersion": "2.0", "NumberOfWorkers": 2, + "Role": { + "Fn::GetAtt": [ + "testkinesisstreamslambdaJobRole42199B9C", + "Arn" + ] + }, "SecurityConfiguration": "ETLJobSecurityConfig", "WorkerType": "G.1X" } @@ -459,9 +459,9 @@ "testkinesisstreamslambdaKinesisStreamGetRecordsIteratorAgeAlarmFB74C363": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -472,9 +472,9 @@ "testkinesisstreamslambdaKinesisStreamReadProvisionedThroughputExceededAlarm5ABF4346": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -764,4 +764,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json index 6910e303d..d49931286 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json @@ -95,9 +95,9 @@ "testkinesisstreamslambdaKinesisStreamGetRecordsIteratorAgeAlarmFB74C363": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -108,9 +108,9 @@ "testkinesisstreamslambdaKinesisStreamReadProvisionedThroughputExceededAlarm5ABF4346": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json index 815e7b32c..c3e70887b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json @@ -413,12 +413,6 @@ "PythonVersion": "3", "ScriptLocation": "s3://fakelocation/fakefile.py" }, - "Role": { - "Fn::GetAtt": [ - "testkinesisstreamslambdaJobRole42199B9C", - "Arn" - ] - }, "DefaultArguments": { "--enable-metrics": true, "--enable-continuous-cloudwatch-log": true, @@ -443,6 +437,12 @@ }, "GlueVersion": "2.0", "NumberOfWorkers": 2, + "Role": { + "Fn::GetAtt": [ + "testkinesisstreamslambdaJobRole42199B9C", + "Arn" + ] + }, "SecurityConfiguration": "ETLJobSecurityConfig", "WorkerType": "G.1X" } @@ -450,9 +450,9 @@ "testkinesisstreamslambdaKinesisStreamGetRecordsIteratorAgeAlarmFB74C363": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -463,9 +463,9 @@ "testkinesisstreamslambdaKinesisStreamReadProvisionedThroughputExceededAlarm5ABF4346": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -755,4 +755,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json index 17ba9aba0..5f138e5ae 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json @@ -422,9 +422,9 @@ "testkinesisfirehoses3KinesisStreamGetRecordsIteratorAgeAlarm52FF77D1": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -435,9 +435,9 @@ "testkinesisfirehoses3KinesisStreamReadProvisionedThroughputExceededAlarm4A9C6943": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json index 539088bd0..df0c49758 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json @@ -143,18 +143,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -423,9 +423,9 @@ "testexistingbucketfirehoses3stackKinesisStreamGetRecordsIteratorAgeAlarmD41CBD58": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -436,9 +436,9 @@ "testexistingbucketfirehoses3stackKinesisStreamReadProvisionedThroughputExceededAlarmEC9D97D6": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -489,109 +489,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json index 3e67087bf..7a92b2333 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json @@ -143,18 +143,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -493,9 +493,9 @@ "testexistingloggingbucketstreamsfirehoses3stackKinesisStreamGetRecordsIteratorAgeAlarmF190BB96": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -506,9 +506,9 @@ "testexistingloggingbucketstreamsfirehoses3stackKinesisStreamReadProvisionedThroughputExceededAlarmCF515815": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -559,109 +559,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json index 1fe2510bc..93eda755b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json @@ -153,18 +153,18 @@ }, "S3Key": "26cf7db64552331215006953bf73e5adfb49b5bf0eb2298bfe04547b76c08b88.zip" }, - "Role": { - "Fn::GetAtt": [ - "testkinesislambdaLambdaFunctionServiceRole965E2A08", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testkinesislambdaLambdaFunctionServiceRole965E2A08", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -196,9 +196,6 @@ "testkinesislambdaLambdaFunctionKinesisEventSourceexistingStreamObjtestkinesislambdaKinesisStreamA54D0C79BE6AA8BC": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testkinesislambdaLambdaFunction7F18F840" - }, "BatchSize": 100, "BisectBatchOnFunctionError": true, "DestinationConfig": { @@ -217,6 +214,9 @@ "Arn" ] }, + "FunctionName": { + "Ref": "testkinesislambdaLambdaFunction7F18F840" + }, "MaximumRecordAgeInSeconds": 86400, "MaximumRetryAttempts": 500, "StartingPosition": "TRIM_HORIZON" @@ -304,9 +304,9 @@ "testkinesislambdaKinesisStreamGetRecordsIteratorAgeAlarm99DB34B3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -317,9 +317,9 @@ "testkinesislambdaKinesisStreamReadProvisionedThroughputExceededAlarmAE98686F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json index cc69403ef..97ed031e5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json @@ -422,9 +422,9 @@ "teststreamfirehoses3KinesisStreamGetRecordsIteratorAgeAlarm8C693DF4": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -435,9 +435,9 @@ "teststreamfirehoses3KinesisStreamReadProvisionedThroughputExceededAlarm7C631AC0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json index a3f9dfb48..674cf8651 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json @@ -124,13 +124,13 @@ }, "S3Key": "26cf7db64552331215006953bf73e5adfb49b5bf0eb2298bfe04547b76c08b88.zip" }, + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "testroleB50A37BE", "Arn" ] }, - "Handler": "index.handler", "Runtime": "nodejs16.x" }, "DependsOn": [ @@ -155,9 +155,6 @@ "testfnKinesisEventSourceexistingteststream96164F11F0EBC1A4": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testfn76BCC25C" - }, "BatchSize": 1, "BisectBatchOnFunctionError": true, "DestinationConfig": { @@ -176,6 +173,9 @@ "Arn" ] }, + "FunctionName": { + "Ref": "testfn76BCC25C" + }, "MaximumRecordAgeInSeconds": 86400, "MaximumRetryAttempts": 500, "StartingPosition": "LATEST" @@ -274,9 +274,9 @@ "testkslambdaKinesisStreamGetRecordsIteratorAgeAlarmD5DC1A73": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -287,9 +287,9 @@ "testkslambdaKinesisStreamReadProvisionedThroughputExceededAlarmFAEF1236": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json index cf6bffe41..3988a597e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json @@ -153,18 +153,18 @@ }, "S3Key": "26cf7db64552331215006953bf73e5adfb49b5bf0eb2298bfe04547b76c08b88.zip" }, - "Role": { - "Fn::GetAtt": [ - "testkinesisstreamslambdaLambdaFunctionServiceRoleAD98836E", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testkinesisstreamslambdaLambdaFunctionServiceRoleAD98836E", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -196,9 +196,6 @@ "testkinesisstreamslambdaLambdaFunctionKinesisEventSourcenoargumentstestkinesisstreamslambdaKinesisStream697B4A2015E59078": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testkinesisstreamslambdaLambdaFunctionB9A91CA7" - }, "BatchSize": 100, "BisectBatchOnFunctionError": true, "DestinationConfig": { @@ -217,6 +214,9 @@ "Arn" ] }, + "FunctionName": { + "Ref": "testkinesisstreamslambdaLambdaFunctionB9A91CA7" + }, "MaximumRecordAgeInSeconds": 86400, "MaximumRetryAttempts": 5, "StartingPosition": "TRIM_HORIZON" @@ -304,9 +304,9 @@ "testkinesisstreamslambdaKinesisStreamGetRecordsIteratorAgeAlarmFB74C363": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -317,9 +317,9 @@ "testkinesisstreamslambdaKinesisStreamReadProvisionedThroughputExceededAlarm5ABF4346": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json index 7c73a959d..314be3205 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json @@ -137,12 +137,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -152,6 +146,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -183,12 +183,6 @@ "testlambdadynamodbstackDynamoTable8138E93B": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ - { - "AttributeName": "id", - "KeyType": "HASH" - } - ], "AttributeDefinitions": [ { "AttributeName": "id", @@ -214,6 +208,12 @@ } } ], + "KeySchema": [ + { + "AttributeName": "id", + "KeyType": "HASH" + } + ], "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json index 53d92cbb8..f0a2aa527 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,32 +657,22 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcDDB49FBEC5F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { - "ServiceName": { - "Fn::Join": [ - "", - [ - "com.amazonaws.", - { - "Ref": "AWS::Region" - }, - ".dynamodb" - ] - ] - }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, "RouteTableIds": [ { "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" @@ -708,7 +693,22 @@ "Ref": "VpcPublicSubnet3RouteTable93458DBB" } ], - "VpcEndpointType": "Gateway" + "ServiceName": { + "Fn::Join": [ + "", + [ + "com.amazonaws.", + { + "Ref": "AWS::Region" + }, + ".dynamodb" + ] + ] + }, + "VpcEndpointType": "Gateway", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testlambdadynamodbstackLambdaFunctionServiceRole758347A1": { @@ -878,12 +878,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -893,6 +887,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -951,19 +951,19 @@ "testlambdadynamodbstackDynamoTable8138E93B": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json index 05c3865e6..17fcd590c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json @@ -168,12 +168,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -183,6 +177,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -238,19 +238,19 @@ "testlambdadynamodbstackDynamoTable8138E93B": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -279,9 +279,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -298,21 +295,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -329,9 +329,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -348,21 +345,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -379,9 +379,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -398,21 +395,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -444,7 +444,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -496,7 +496,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -516,11 +516,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -531,17 +526,33 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcDDB49FBEC5F": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "RouteTableIds": [ + { + "Ref": "VpcisolatedSubnet1RouteTableE442650B" + }, + { + "Ref": "VpcisolatedSubnet2RouteTable334F9764" + }, + { + "Ref": "VpcisolatedSubnet3RouteTableA2F6BBC0" + } + ], "ServiceName": { "Fn::Join": [ "", @@ -554,21 +565,10 @@ ] ] }, + "VpcEndpointType": "Gateway", "VpcId": { "Ref": "Vpc8378EB38" - }, - "RouteTableIds": [ - { - "Ref": "VpcisolatedSubnet1RouteTableE442650B" - }, - { - "Ref": "VpcisolatedSubnet2RouteTable334F9764" - }, - { - "Ref": "VpcisolatedSubnet3RouteTableA2F6BBC0" - } - ], - "VpcEndpointType": "Gateway" + } } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json index c65bb799c..0ca01d4fe 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json @@ -126,12 +126,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -141,6 +135,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -172,19 +172,19 @@ "testlambdadynamodbstackDynamoTable8138E93B": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json index a6ec259c1..62f5de7c5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json @@ -126,12 +126,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -141,6 +135,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdadynamodbstackLambdaFunctionServiceRole758347A1", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -172,16 +172,16 @@ "testlambdadynamodbstackDynamoTable8138E93B": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], "PointInTimeRecoverySpecification": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json index fb888101b..4cfeed2f1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json @@ -126,12 +126,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -141,6 +135,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -172,19 +172,19 @@ "testlambdadynamodbstackDynamoTable8138E93B": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json index 27ca0eb36..4d18bbc39 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json @@ -19,9 +19,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/18", "MapPublicIpOnLaunch": false, @@ -38,21 +35,24 @@ "Key": "Name", "Value": "existingResources/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingResources/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -69,9 +69,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.64.0/18", "MapPublicIpOnLaunch": false, @@ -88,21 +85,24 @@ "Key": "Name", "Value": "existingResources/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingResources/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -119,9 +119,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.128.0/18", "MapPublicIpOnLaunch": false, @@ -138,21 +135,24 @@ "Key": "Name", "Value": "existingResources/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingResources/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -184,7 +184,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc" + "Value": "existingResources/Vpc/FlowLog" } ] } @@ -236,7 +236,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc" + "Value": "existingResources/Vpc/FlowLog" } ] }, @@ -256,11 +256,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -271,12 +266,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc" + "Value": "existingResources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "testsgsecuritygroup89DCF621": { @@ -366,12 +366,6 @@ }, "S3Key": "c1b23d6af38c04acb744bda25a3dc7f4394daea942c67eaff40911a707a3c37a.zip" }, - "Role": { - "Fn::GetAtt": [ - "testfunctionServiceRoleFB85AD63", - "Arn" - ] - }, "Environment": { "Variables": { "CACHE_ENDPOINT": { @@ -397,6 +391,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testfunctionServiceRoleFB85AD63", + "Arn" + ] + }, "Runtime": "nodejs16.x", "VpcConfig": { "SecurityGroupIds": [ @@ -450,6 +450,7 @@ "ecsubnetgrouptestcache": { "Type": "AWS::ElastiCache::SubnetGroup", "Properties": { + "CacheSubnetGroupName": "test-cache-subnet-group", "Description": "Solutions Constructs generated Cache Subnet Group", "SubnetIds": [ { @@ -461,8 +462,7 @@ { "Ref": "VpcisolatedSubnet3Subnet44F2537D" } - ], - "CacheSubnetGroupName": "test-cache-subnet-group" + ] } }, "testcachecachesg7265880E": { @@ -502,12 +502,12 @@ "testcachecluster": { "Type": "AWS::ElastiCache::CacheCluster", "Properties": { - "CacheNodeType": "cache.t3.medium", - "Engine": "memcached", - "NumCacheNodes": 2, "AZMode": "cross-az", + "CacheNodeType": "cache.t3.medium", "CacheSubnetGroupName": "test-cache-subnet-group", "ClusterName": "test-cache-cdk-cluster", + "Engine": "memcached", + "NumCacheNodes": 2, "Port": 11222, "VpcSecurityGroupIds": [ { @@ -561,7 +561,6 @@ "testtestingress291C0179": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { - "IpProtocol": "TCP", "Description": "Self referencing rule to control access to Elasticache memcached cluster", "FromPort": { "Fn::GetAtt": [ @@ -575,6 +574,7 @@ "GroupId" ] }, + "IpProtocol": "TCP", "SourceSecurityGroupId": { "Fn::GetAtt": [ "testtestcachesg9F6CF9E2", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json index d7efaa91f..6c53c8f4c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json @@ -34,7 +34,6 @@ "testtestingress291C0179": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { - "IpProtocol": "TCP", "Description": "Self referencing rule to control access to Elasticache memcached cluster", "FromPort": 11222, "GroupId": { @@ -43,6 +42,7 @@ "GroupId" ] }, + "IpProtocol": "TCP", "SourceSecurityGroupId": { "Fn::GetAtt": [ "testtestcachesg9F6CF9E2", @@ -58,6 +58,7 @@ "testecsubnetgrouptest868C53AE": { "Type": "AWS::ElastiCache::SubnetGroup", "Properties": { + "CacheSubnetGroupName": "test-subnet-group", "Description": "Solutions Constructs generated Cache Subnet Group", "SubnetIds": [ { @@ -69,19 +70,18 @@ { "Ref": "VpcisolatedSubnet3Subnet44F2537D" } - ], - "CacheSubnetGroupName": "test-subnet-group" + ] } }, "testtestcluster57FB8D14": { "Type": "AWS::ElastiCache::CacheCluster", "Properties": { - "CacheNodeType": "cache.t3.medium", - "Engine": "memcached", - "NumCacheNodes": 2, "AZMode": "cross-az", + "CacheNodeType": "cache.t3.medium", "CacheSubnetGroupName": "test-subnet-group", "ClusterName": "test-cdk-cluster", + "Engine": "memcached", + "NumCacheNodes": 2, "Port": 11222, "VpcSecurityGroupIds": [ { @@ -235,12 +235,6 @@ }, "S3Key": "c1b23d6af38c04acb744bda25a3dc7f4394daea942c67eaff40911a707a3c37a.zip" }, - "Role": { - "Fn::GetAtt": [ - "testLambdaFunctionServiceRoleA03EDA2B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -267,6 +261,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testLambdaFunctionServiceRoleA03EDA2B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -343,9 +343,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -362,21 +359,24 @@ "Key": "Name", "Value": "newResources/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "newResources/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -393,9 +393,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -412,21 +409,24 @@ "Key": "Name", "Value": "newResources/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "newResources/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -443,9 +443,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -462,21 +459,24 @@ "Key": "Name", "Value": "newResources/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "newResources/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -508,7 +508,7 @@ "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc" + "Value": "newResources/Vpc/FlowLog" } ] } @@ -560,7 +560,7 @@ "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc" + "Value": "newResources/Vpc/FlowLog" } ] }, @@ -580,11 +580,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -595,12 +590,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc" + "Value": "newResources/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json index c0664ed15..cc0020c2e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json @@ -34,7 +34,6 @@ "testtestingress291C0179": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { - "IpProtocol": "TCP", "Description": "Self referencing rule to control access to Elasticache memcached cluster", "FromPort": 11222, "GroupId": { @@ -43,6 +42,7 @@ "GroupId" ] }, + "IpProtocol": "TCP", "SourceSecurityGroupId": { "Fn::GetAtt": [ "testtestcachesg9F6CF9E2", @@ -58,6 +58,7 @@ "testecsubnetgrouptest868C53AE": { "Type": "AWS::ElastiCache::SubnetGroup", "Properties": { + "CacheSubnetGroupName": "test-subnet-group", "Description": "Solutions Constructs generated Cache Subnet Group", "SubnetIds": [ { @@ -69,19 +70,18 @@ { "Ref": "VpcisolatedSubnet3Subnet44F2537D" } - ], - "CacheSubnetGroupName": "test-subnet-group" + ] } }, "testtestcluster57FB8D14": { "Type": "AWS::ElastiCache::CacheCluster", "Properties": { - "CacheNodeType": "cache.t3.medium", - "Engine": "memcached", - "NumCacheNodes": 2, "AZMode": "single-az", + "CacheNodeType": "cache.t3.medium", "CacheSubnetGroupName": "test-subnet-group", "ClusterName": "test-cdk-cluster", + "Engine": "memcached", + "NumCacheNodes": 2, "Port": 11222, "VpcSecurityGroupIds": [ { @@ -235,12 +235,6 @@ }, "S3Key": "c1b23d6af38c04acb744bda25a3dc7f4394daea942c67eaff40911a707a3c37a.zip" }, - "Role": { - "Fn::GetAtt": [ - "testLambdaFunctionServiceRoleA03EDA2B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -267,6 +261,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testLambdaFunctionServiceRoleA03EDA2B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -343,9 +343,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "192.68.0.0/18", "MapPublicIpOnLaunch": false, @@ -362,21 +359,24 @@ "Key": "Name", "Value": "withClientProps/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "withClientProps/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -393,9 +393,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "192.68.64.0/18", "MapPublicIpOnLaunch": false, @@ -412,21 +409,24 @@ "Key": "Name", "Value": "withClientProps/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "withClientProps/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -443,9 +443,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "192.68.128.0/18", "MapPublicIpOnLaunch": false, @@ -462,21 +459,24 @@ "Key": "Name", "Value": "withClientProps/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "withClientProps/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -508,7 +508,7 @@ "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc" + "Value": "withClientProps/Vpc/FlowLog" } ] } @@ -560,7 +560,7 @@ "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc" + "Value": "withClientProps/Vpc/FlowLog" } ] }, @@ -580,11 +580,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -595,12 +590,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc" + "Value": "withClientProps/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json index f2268c180..ea01e758f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json @@ -139,12 +139,6 @@ }, "S3Key": "35bbbc7b04b21f225891f139adf234188f348ebad5f4bbc2c06edf8aa3784c97.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaelasticsearchkibana5LambdaFunctionServiceRole26E43B12", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -157,6 +151,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaelasticsearchkibana5LambdaFunctionServiceRole26E43B12", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -242,9 +242,6 @@ "testlambdaelasticsearchkibana5CognitoUserPoolClientB41FB91B": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaelasticsearchkibana5CognitoUserPool4E321CD0" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -262,7 +259,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaelasticsearchkibana5CognitoUserPool4E321CD0" + } } }, "testlambdaelasticsearchkibana5CognitoIdentityPool1B0A6046": { @@ -618,9 +618,9 @@ "testlambdaelasticsearchkibana5StatusRedAlarm916EC672": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -631,9 +631,9 @@ "testlambdaelasticsearchkibana5StatusYellowAlarm7DCAF60A": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -644,9 +644,9 @@ "testlambdaelasticsearchkibana5FreeStorageSpaceTooLowAlarmEC2C0D7B": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -657,9 +657,9 @@ "testlambdaelasticsearchkibana5IndexWritesBlockedTooHighAlarmD496CE3E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -670,9 +670,9 @@ "testlambdaelasticsearchkibana5AutomatedSnapshotFailureTooHighAlarm97129BC4": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -683,9 +683,9 @@ "testlambdaelasticsearchkibana5CPUUtilizationTooHighAlarm3BAAA397": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -696,9 +696,9 @@ "testlambdaelasticsearchkibana5JVMMemoryPressureTooHighAlarm251AD583": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -709,9 +709,9 @@ "testlambdaelasticsearchkibana5MasterCPUUtilizationTooHighAlarm97A330CC": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -722,9 +722,9 @@ "testlambdaelasticsearchkibana5MasterJVMMemoryPressureTooHighAlarm7DABB351": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -750,9 +750,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -769,21 +766,24 @@ "Key": "Name", "Value": "deployFunctionWithClusterConfig/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithClusterConfig/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -800,9 +800,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -819,21 +816,24 @@ "Key": "Name", "Value": "deployFunctionWithClusterConfig/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithClusterConfig/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -865,7 +865,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc" + "Value": "deployFunctionWithClusterConfig/Vpc/FlowLog" } ] } @@ -917,7 +917,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc" + "Value": "deployFunctionWithClusterConfig/Vpc/FlowLog" } ] }, @@ -937,10 +937,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -951,10 +947,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc" + "Value": "deployFunctionWithClusterConfig/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json index 419ab19d7..0e5f2100c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json @@ -18,9 +18,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -37,7 +34,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -53,15 +53,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -78,12 +78,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -105,15 +105,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -129,9 +129,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -148,7 +145,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -164,15 +164,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -189,12 +189,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -216,15 +216,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -240,9 +240,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -259,7 +256,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -275,15 +275,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -300,12 +300,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -327,15 +327,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -351,9 +351,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -370,21 +367,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -401,21 +401,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -432,21 +429,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -463,21 +463,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -494,21 +491,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -525,12 +525,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -548,11 +548,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } ] }, @@ -646,10 +646,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -660,10 +656,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -806,12 +806,6 @@ "S3Bucket": "cdk-hnb659fds-assets-12345678-test-region", "S3Key": "35bbbc7b04b21f225891f139adf234188f348ebad5f4bbc2c06edf8aa3784c97.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaelasticsearchkibana4LambdaFunctionServiceRoleA52BB7F9", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -824,6 +818,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaelasticsearchkibana4LambdaFunctionServiceRoleA52BB7F9", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -916,9 +916,6 @@ "testlambdaelasticsearchkibana4CognitoUserPoolClientABBF34C4": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaelasticsearchkibana4CognitoUserPool37A5CDE1" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -936,7 +933,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaelasticsearchkibana4CognitoUserPool37A5CDE1" + } } }, "testlambdaelasticsearchkibana4CognitoIdentityPool76EE9793": { @@ -1295,9 +1295,9 @@ "testlambdaelasticsearchkibana4StatusRedAlarm56DEE5C7": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -1308,9 +1308,9 @@ "testlambdaelasticsearchkibana4StatusYellowAlarm810B4F9E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -1321,9 +1321,9 @@ "testlambdaelasticsearchkibana4FreeStorageSpaceTooLowAlarmF3FB31EA": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -1334,9 +1334,9 @@ "testlambdaelasticsearchkibana4IndexWritesBlockedTooHighAlarmF2968C92": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -1347,9 +1347,9 @@ "testlambdaelasticsearchkibana4AutomatedSnapshotFailureTooHighAlarm53EB1ABB": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -1360,9 +1360,9 @@ "testlambdaelasticsearchkibana4CPUUtilizationTooHighAlarm29B67D10": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -1373,9 +1373,9 @@ "testlambdaelasticsearchkibana4JVMMemoryPressureTooHighAlarm9DDED711": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -1386,9 +1386,9 @@ "testlambdaelasticsearchkibana4MasterCPUUtilizationTooHighAlarmE66867F2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -1399,9 +1399,9 @@ "testlambdaelasticsearchkibana4MasterJVMMemoryPressureTooHighAlarm83E1822E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json index de038946d..ca661cffd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json @@ -137,12 +137,6 @@ "S3Bucket": "cdk-hnb659fds-assets-12345678-test-region", "S3Key": "35bbbc7b04b21f225891f139adf234188f348ebad5f4bbc2c06edf8aa3784c97.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaelasticsearchkibana3LambdaFunctionServiceRoleA3C1E07E", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -155,6 +149,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaelasticsearchkibana3LambdaFunctionServiceRoleA3C1E07E", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -244,9 +244,6 @@ "testlambdaelasticsearchkibana3CognitoUserPoolClient89D3C6A0": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaelasticsearchkibana3CognitoUserPoolEF0D5793" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -264,7 +261,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaelasticsearchkibana3CognitoUserPoolEF0D5793" + } } }, "testlambdaelasticsearchkibana3CognitoIdentityPool48956B3D": { @@ -623,9 +623,9 @@ "testlambdaelasticsearchkibana3StatusRedAlarmFECC950E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -636,9 +636,9 @@ "testlambdaelasticsearchkibana3StatusYellowAlarmC7FC4662": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -649,9 +649,9 @@ "testlambdaelasticsearchkibana3FreeStorageSpaceTooLowAlarmB9AD5427": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -662,9 +662,9 @@ "testlambdaelasticsearchkibana3IndexWritesBlockedTooHighAlarm36E1D418": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -675,9 +675,9 @@ "testlambdaelasticsearchkibana3AutomatedSnapshotFailureTooHighAlarmA83D4971": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -688,9 +688,9 @@ "testlambdaelasticsearchkibana3CPUUtilizationTooHighAlarmE77470C0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -701,9 +701,9 @@ "testlambdaelasticsearchkibana3JVMMemoryPressureTooHighAlarm084D2991": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -714,9 +714,9 @@ "testlambdaelasticsearchkibana3MasterCPUUtilizationTooHighAlarm3331F781": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -727,9 +727,9 @@ "testlambdaelasticsearchkibana3MasterJVMMemoryPressureTooHighAlarm149E8D14": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -755,9 +755,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/18", "MapPublicIpOnLaunch": false, @@ -774,21 +771,24 @@ "Key": "Name", "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -805,9 +805,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.64.0/18", "MapPublicIpOnLaunch": false, @@ -824,21 +821,24 @@ "Key": "Name", "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -855,9 +855,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.128.0/18", "MapPublicIpOnLaunch": false, @@ -874,21 +871,24 @@ "Key": "Name", "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -920,7 +920,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc" + "Value": "deployFunctionWithVpcProps/Vpc/FlowLog" } ] } @@ -972,7 +972,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc" + "Value": "deployFunctionWithVpcProps/Vpc/FlowLog" } ] }, @@ -992,10 +992,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1006,10 +1002,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc" + "Value": "deployFunctionWithVpcProps/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json index 87be3185f..17ec407e2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json @@ -139,12 +139,6 @@ }, "S3Key": "35bbbc7b04b21f225891f139adf234188f348ebad5f4bbc2c06edf8aa3784c97.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaelasticsearchkibanaLambdaFunctionServiceRole3AFFEAA2", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -157,6 +151,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaelasticsearchkibanaLambdaFunctionServiceRole3AFFEAA2", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -246,9 +246,6 @@ "testlambdaelasticsearchkibanaCognitoUserPoolClient8F70A2AA": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -266,7 +263,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" + } } }, "testlambdaelasticsearchkibanaCognitoIdentityPoolC48068F0": { @@ -625,9 +625,9 @@ "testlambdaelasticsearchkibanaStatusRedAlarmCFCDB629": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -638,9 +638,9 @@ "testlambdaelasticsearchkibanaStatusYellowAlarm24B9D1CB": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -651,9 +651,9 @@ "testlambdaelasticsearchkibanaFreeStorageSpaceTooLowAlarm0B4D4E35": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -664,9 +664,9 @@ "testlambdaelasticsearchkibanaIndexWritesBlockedTooHighAlarmB8C0E99C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -677,9 +677,9 @@ "testlambdaelasticsearchkibanaAutomatedSnapshotFailureTooHighAlarm75F2676B": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -690,9 +690,9 @@ "testlambdaelasticsearchkibanaCPUUtilizationTooHighAlarmF16BA5D9": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -703,9 +703,9 @@ "testlambdaelasticsearchkibanaJVMMemoryPressureTooHighAlarm18224533": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -716,9 +716,9 @@ "testlambdaelasticsearchkibanaMasterCPUUtilizationTooHighAlarmE5E5999F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -729,9 +729,9 @@ "testlambdaelasticsearchkibanaMasterJVMMemoryPressureTooHighAlarm297FF1BE": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -757,9 +757,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -776,21 +773,24 @@ "Key": "Name", "Value": "deployToFiveZones/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployToFiveZones/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -807,9 +807,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -826,21 +823,24 @@ "Key": "Name", "Value": "deployToFiveZones/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployToFiveZones/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -857,9 +857,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -876,21 +873,24 @@ "Key": "Name", "Value": "deployToFiveZones/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployToFiveZones/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -922,7 +922,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc" + "Value": "deployToFiveZones/Vpc/FlowLog" } ] } @@ -974,7 +974,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc" + "Value": "deployToFiveZones/Vpc/FlowLog" } ] }, @@ -994,10 +994,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1008,10 +1004,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc" + "Value": "deployToFiveZones/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json index 9adfc0a56..cff23b60c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json @@ -139,12 +139,6 @@ }, "S3Key": "35bbbc7b04b21f225891f139adf234188f348ebad5f4bbc2c06edf8aa3784c97.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaelasticsearchkibanaLambdaFunctionServiceRole3AFFEAA2", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -157,6 +151,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaelasticsearchkibanaLambdaFunctionServiceRole3AFFEAA2", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -238,9 +238,6 @@ "testlambdaelasticsearchkibanaCognitoUserPoolClient8F70A2AA": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -258,7 +255,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" + } } }, "testlambdaelasticsearchkibanaCognitoIdentityPoolC48068F0": { @@ -608,9 +608,9 @@ "testlambdaelasticsearchkibanaStatusRedAlarmCFCDB629": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -621,9 +621,9 @@ "testlambdaelasticsearchkibanaStatusYellowAlarm24B9D1CB": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -634,9 +634,9 @@ "testlambdaelasticsearchkibanaFreeStorageSpaceTooLowAlarm0B4D4E35": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -647,9 +647,9 @@ "testlambdaelasticsearchkibanaIndexWritesBlockedTooHighAlarmB8C0E99C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -660,9 +660,9 @@ "testlambdaelasticsearchkibanaAutomatedSnapshotFailureTooHighAlarm75F2676B": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -673,9 +673,9 @@ "testlambdaelasticsearchkibanaCPUUtilizationTooHighAlarmF16BA5D9": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -686,9 +686,9 @@ "testlambdaelasticsearchkibanaJVMMemoryPressureTooHighAlarm18224533": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -699,9 +699,9 @@ "testlambdaelasticsearchkibanaMasterCPUUtilizationTooHighAlarmE5E5999F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -712,9 +712,9 @@ "testlambdaelasticsearchkibanaMasterJVMMemoryPressureTooHighAlarm297FF1BE": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -740,9 +740,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -759,21 +756,24 @@ "Key": "Name", "Value": "disabledZoneAwareness/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "disabledZoneAwareness/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -805,7 +805,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabledZoneAwareness/Vpc" + "Value": "disabledZoneAwareness/Vpc/FlowLog" } ] } @@ -857,7 +857,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabledZoneAwareness/Vpc" + "Value": "disabledZoneAwareness/Vpc/FlowLog" } ] }, @@ -877,10 +877,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -891,10 +887,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "disabledZoneAwareness/Vpc" + "Value": "disabledZoneAwareness/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json index a797b241a..f76540ca7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json @@ -98,12 +98,6 @@ }, "S3Key": "35bbbc7b04b21f225891f139adf234188f348ebad5f4bbc2c06edf8aa3784c97.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaelasticsearchkibana2LambdaFunctionServiceRoleA59E9EBF", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -116,6 +110,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaelasticsearchkibana2LambdaFunctionServiceRoleA59E9EBF", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -181,9 +181,6 @@ "testlambdaelasticsearchkibana2CognitoUserPoolClientB0F3872A": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaelasticsearchkibana2CognitoUserPool9D73D9DA" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -201,7 +198,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaelasticsearchkibana2CognitoUserPool9D73D9DA" + } } }, "testlambdaelasticsearchkibana2CognitoIdentityPool0681F400": { @@ -539,9 +539,9 @@ "testlambdaelasticsearchkibana2StatusRedAlarm508A4D17": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -552,9 +552,9 @@ "testlambdaelasticsearchkibana2StatusYellowAlarmEF13F129": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -565,9 +565,9 @@ "testlambdaelasticsearchkibana2FreeStorageSpaceTooLowAlarm1ED7AA90": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -578,9 +578,9 @@ "testlambdaelasticsearchkibana2IndexWritesBlockedTooHighAlarmCE02A217": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -591,9 +591,9 @@ "testlambdaelasticsearchkibana2AutomatedSnapshotFailureTooHighAlarm75E8F988": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -604,9 +604,9 @@ "testlambdaelasticsearchkibana2CPUUtilizationTooHighAlarm7E4A7ADE": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -617,9 +617,9 @@ "testlambdaelasticsearchkibana2JVMMemoryPressureTooHighAlarm7CB5E1C7": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -630,9 +630,9 @@ "testlambdaelasticsearchkibana2MasterCPUUtilizationTooHighAlarmE22B714C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -643,9 +643,9 @@ "testlambdaelasticsearchkibana2MasterJVMMemoryPressureTooHighAlarm37A392A6": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json index 5ab39a3c3..8489843f4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json @@ -123,12 +123,6 @@ }, "S3Key": "b5faf4ff1ebde477120133d1e645d20d7c3d4952b76c3b586100069b94b2f146.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaeventbridgeLambdaFunctionServiceRole0FD85077", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -136,6 +130,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaeventbridgeLambdaFunctionServiceRole0FD85077", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json index ce8b67b82..e44ac5c83 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json @@ -150,12 +150,6 @@ }, "S3Key": "b5faf4ff1ebde477120133d1e645d20d7c3d4952b76c3b586100069b94b2f146.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaeventbridgeLambdaFunctionServiceRole0FD85077", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -165,6 +159,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaeventbridgeLambdaFunctionServiceRole0FD85077", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -241,9 +241,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -260,21 +257,24 @@ "Key": "Name", "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -291,9 +291,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -310,21 +307,24 @@ "Key": "Name", "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -341,9 +341,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -360,21 +357,24 @@ "Key": "Name", "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -406,7 +406,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc" + "Value": "deployFunctionWithNewEventBus/Vpc/FlowLog" } ] } @@ -458,7 +458,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc" + "Value": "deployFunctionWithNewEventBus/Vpc/FlowLog" } ] }, @@ -478,11 +478,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -493,17 +488,31 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc" + "Value": "deployFunctionWithNewEventBus/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcCLOUDWATCHEVENTS1A0DAFBF": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "deployFunctionWithNewEventBusCLOUDWATCHEVENTSsecuritygroupD8A263BF", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -516,18 +525,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "deployFunctionWithNewEventBusCLOUDWATCHEVENTSsecuritygroupD8A263BF", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -539,7 +536,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "deployFunctionWithNewEventBusCLOUDWATCHEVENTSsecuritygroupD8A263BF": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json index 039171e95..916504c1e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json @@ -164,12 +164,6 @@ }, "S3Key": "b5faf4ff1ebde477120133d1e645d20d7c3d4952b76c3b586100069b94b2f146.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaeventbridgeLambdaFunctionServiceRole0FD85077", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -177,6 +171,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaeventbridgeLambdaFunctionServiceRole0FD85077", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -247,9 +247,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -266,21 +263,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -297,9 +297,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -316,21 +313,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -347,9 +347,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -366,21 +363,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -412,7 +412,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -464,7 +464,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -484,11 +484,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -499,17 +494,31 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcCLOUDWATCHEVENTS1A0DAFBF": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "deployFunctionWithVpcCLOUDWATCHEVENTSsecuritygroupB8797C76", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -522,18 +531,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "deployFunctionWithVpcCLOUDWATCHEVENTSsecuritygroupB8797C76", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -545,7 +542,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "deployFunctionWithVpcCLOUDWATCHEVENTSsecuritygroupB8797C76": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json index bf5172fd4..5f3d822d0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json @@ -109,12 +109,6 @@ }, "S3Key": "b5faf4ff1ebde477120133d1e645d20d7c3d4952b76c3b586100069b94b2f146.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -124,6 +118,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json index 39b2e657e..6756239b0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json @@ -123,12 +123,6 @@ }, "S3Key": "b5faf4ff1ebde477120133d1e645d20d7c3d4952b76c3b586100069b94b2f146.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -136,6 +130,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json index a5d16ad28..6e8505403 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/package.json @@ -54,7 +54,7 @@ "devDependencies": { "@types/jest": "^27.4.0", "@types/node": "^10.3.0", - "aws-cdk-lib": "2.82.0", + "aws-cdk-lib": "0.0.0", "@aws-solutions-constructs/core": "0.0.0", "constructs": "^10.0.0" }, @@ -74,7 +74,7 @@ }, "peerDependencies": { "@aws-solutions-constructs/core": "0.0.0", - "aws-cdk-lib": "^2.82.0", + "aws-cdk-lib": "^0.0.0", "constructs": "^10.0.0" }, "keywords": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json index d423282c9..95121ec2e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json @@ -143,18 +143,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -315,12 +315,6 @@ }, "S3Key": "e0128dd6e376c58a74b37bd6178ded8a5909d414a6891c26547b9778ac25679b.zip" }, - "Role": { - "Fn::GetAtt": [ - "minimalargumentsLambdaFunctionServiceRole73B77FF7", - "Arn" - ] - }, "Environment": { "Variables": { "KENDRA_INDEX_ID": { @@ -332,6 +326,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "minimalargumentsLambdaFunctionServiceRole73B77FF7", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -598,6 +598,13 @@ "minimalargumentsdatasourceminimalarguments05A02FF3B": { "Type": "AWS::Kendra::DataSource", "Properties": { + "DataSourceConfiguration": { + "S3Configuration": { + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + } + }, "IndexId": { "Ref": "minimalargumentskendraindexminimalarguments5CBDD236" }, @@ -622,123 +629,13 @@ ] ] }, - "Type": "S3", - "DataSourceConfiguration": { - "S3Configuration": { - "BucketName": { - "Ref": "scrapBucketB11863B7" - } - } - }, "RoleArn": { "Fn::GetAtt": [ "minimalargumentsdatasourceroleminimalarguments00EAC5006", "Arn" ] - } - } - } - }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" + }, + "Type": "S3" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json index 9e715550e..3850d7547 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json @@ -143,18 +143,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -332,12 +332,6 @@ }, "S3Key": "e0128dd6e376c58a74b37bd6178ded8a5909d414a6891c26547b9778ac25679b.zip" }, - "Role": { - "Fn::GetAtt": [ - "minimalargumentsLambdaFunctionServiceRole73B77FF7", - "Arn" - ] - }, "Environment": { "Variables": { "KENDRA_INDEX_ID": { @@ -349,6 +343,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "minimalargumentsLambdaFunctionServiceRole73B77FF7", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -615,6 +615,13 @@ "minimalargumentsdatasourceminimalarguments05A02FF3B": { "Type": "AWS::Kendra::DataSource", "Properties": { + "DataSourceConfiguration": { + "S3Configuration": { + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + } + }, "IndexId": { "Ref": "minimalargumentskendraindexminimalarguments5CBDD236" }, @@ -639,33 +646,18 @@ ] ] }, - "Type": "S3", - "DataSourceConfiguration": { - "S3Configuration": { - "BucketName": { - "Ref": "scrapBucketB11863B7" - } - } - }, "RoleArn": { "Fn::GetAtt": [ "minimalargumentsdatasourceroleminimalarguments00EAC5006", "Arn" ] - } + }, + "Type": "S3" } }, "minimalargumentskendradatasourceminimalarguments1DA6FACEE": { "Type": "AWS::Kendra::DataSource", "Properties": { - "IndexId": { - "Fn::GetAtt": [ - "minimalargumentskendraindexminimalarguments5CBDD236", - "Id" - ] - }, - "Name": "web-source", - "Type": "WEBCRAWLER", "DataSourceConfiguration": { "WebCrawlerConfiguration": { "CrawlDepth": 1, @@ -678,115 +670,20 @@ } } }, + "IndexId": { + "Fn::GetAtt": [ + "minimalargumentskendraindexminimalarguments5CBDD236", + "Id" + ] + }, + "Name": "web-source", "RoleArn": { "Fn::GetAtt": [ "existingRole3E995BBA", "Arn" ] - } - } - } - }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" + }, + "Type": "WEBCRAWLER" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json index 394098d54..0bc0c7c64 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json @@ -143,18 +143,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -356,12 +356,6 @@ }, "S3Key": "e0128dd6e376c58a74b37bd6178ded8a5909d414a6891c26547b9778ac25679b.zip" }, - "Role": { - "Fn::GetAtt": [ - "minimalargumentsLambdaFunctionServiceRole73B77FF7", - "Arn" - ] - }, "Environment": { "Variables": { "KENDRA_INDEX_ID": { @@ -373,6 +367,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "minimalargumentsLambdaFunctionServiceRole73B77FF7", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -663,6 +663,13 @@ "minimalargumentsdatasourceminimalarguments05A02FF3B": { "Type": "AWS::Kendra::DataSource", "Properties": { + "DataSourceConfiguration": { + "S3Configuration": { + "BucketName": { + "Ref": "scrapBucketB11863B7" + } + } + }, "IndexId": { "Ref": "minimalargumentskendraindexminimalarguments5CBDD236" }, @@ -687,20 +694,13 @@ ] ] }, - "Type": "S3", - "DataSourceConfiguration": { - "S3Configuration": { - "BucketName": { - "Ref": "scrapBucketB11863B7" - } - } - }, "RoleArn": { "Fn::GetAtt": [ "minimalargumentsdatasourceroleminimalarguments00EAC5006", "Arn" ] - } + }, + "Type": "S3" } }, "Vpc8378EB38": { @@ -721,9 +721,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -740,21 +737,24 @@ "Key": "Name", "Value": "with-vpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "with-vpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -771,9 +771,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -790,21 +787,24 @@ "Key": "Name", "Value": "with-vpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "with-vpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -821,9 +821,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -840,21 +837,24 @@ "Key": "Name", "Value": "with-vpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "with-vpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -886,7 +886,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc" + "Value": "with-vpc/Vpc/FlowLog" } ] } @@ -938,7 +938,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc" + "Value": "with-vpc/Vpc/FlowLog" } ] }, @@ -958,10 +958,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -972,10 +968,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc" + "Value": "with-vpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -984,6 +984,15 @@ "VpcKENDRAD98378E1": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "withvpcKENDRAsecuritygroup6E04E691", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -996,18 +1005,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "withvpcKENDRAsecuritygroup6E04E691", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -1019,7 +1016,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "withvpcKENDRAsecuritygroup6E04E691": { @@ -1081,109 +1081,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json index b2ff686f1..00be5feb3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json @@ -550,18 +550,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -668,18 +668,18 @@ }, "S3Key": "e223396f670e1c26b56c83fd2179ab8672928b9795821c6a437874a06625eb53.zip" }, - "Role": { - "Fn::GetAtt": [ - "existingfunctionServiceRole90E818C0", - "Arn" - ] - }, "Environment": { "Variables": { "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehoseexistingfunctiondestinationfirehoseE53928C2" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "existingfunctionServiceRole90E818C0", + "Arn" + ] + }, "Runtime": "nodejs18.x" }, "DependsOn": [ @@ -706,109 +706,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json index 0c3273c35..624ba79bd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json @@ -550,18 +550,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -615,9 +615,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -634,7 +631,10 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -650,15 +650,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -675,12 +675,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -702,15 +702,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -726,9 +726,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -745,7 +742,10 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -761,15 +761,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -786,12 +786,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -813,15 +813,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -837,9 +837,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -856,7 +853,10 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -872,15 +872,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -897,12 +897,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -924,15 +924,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -948,9 +948,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -967,21 +964,24 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -998,21 +998,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -1029,21 +1026,24 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -1060,21 +1060,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -1091,21 +1088,24 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -1122,12 +1122,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -1145,11 +1145,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -1171,7 +1171,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "existing-vpc/Vpc/FlowLog" } ] } @@ -1223,7 +1223,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "existing-vpc/Vpc/FlowLog" } ] }, @@ -1243,10 +1243,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1257,10 +1253,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "existing-vpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1269,6 +1269,15 @@ "VpcKINESISFIREHOSE4115B5D1": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingvpcKINESISFIREHOSEsecuritygroupF123580F", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -1281,18 +1290,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingvpcKINESISFIREHOSEsecuritygroupF123580F", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -1304,7 +1301,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testconstructLambdaFunctionServiceRole435FDF6F": { @@ -1461,18 +1461,18 @@ }, "S3Key": "e223396f670e1c26b56c83fd2179ab8672928b9795821c6a437874a06625eb53.zip" }, - "Role": { - "Fn::GetAtt": [ - "testconstructLambdaFunctionServiceRole435FDF6F", - "Arn" - ] - }, "Environment": { "Variables": { "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehoseexistingvpcdestinationfirehoseFCC6BBF7" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testconstructLambdaFunctionServiceRole435FDF6F", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -1587,109 +1587,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json index ceb539324..77af4c7da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json @@ -550,18 +550,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -751,18 +751,18 @@ }, "S3Key": "e223396f670e1c26b56c83fd2179ab8672928b9795821c6a437874a06625eb53.zip" }, - "Role": { - "Fn::GetAtt": [ - "testconstructLambdaFunctionServiceRole435FDF6F", - "Arn" - ] - }, "Environment": { "Variables": { "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehosenewvpcdestinationfirehoseEC1F5A2C" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testconstructLambdaFunctionServiceRole435FDF6F", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -833,9 +833,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.100.0.0/18", "MapPublicIpOnLaunch": false, @@ -852,21 +849,24 @@ "Key": "Name", "Value": "new-vpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-vpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -883,9 +883,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.100.64.0/18", "MapPublicIpOnLaunch": false, @@ -902,21 +899,24 @@ "Key": "Name", "Value": "new-vpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-vpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -933,9 +933,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.100.128.0/18", "MapPublicIpOnLaunch": false, @@ -952,21 +949,24 @@ "Key": "Name", "Value": "new-vpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "new-vpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -998,7 +998,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc" + "Value": "new-vpc/Vpc/FlowLog" } ] } @@ -1050,7 +1050,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc" + "Value": "new-vpc/Vpc/FlowLog" } ] }, @@ -1070,10 +1070,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1084,10 +1080,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc" + "Value": "new-vpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1096,6 +1096,15 @@ "VpcKINESISFIREHOSE4115B5D1": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "newvpcKINESISFIREHOSEsecuritygroup3F345517", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -1108,18 +1117,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "newvpcKINESISFIREHOSEsecuritygroup3F345517", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -1131,7 +1128,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newvpcKINESISFIREHOSEsecuritygroup3F345517": { @@ -1193,109 +1193,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json index 0c347bb90..688ddcad6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json @@ -550,18 +550,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -710,18 +710,18 @@ }, "S3Key": "e223396f670e1c26b56c83fd2179ab8672928b9795821c6a437874a06625eb53.zip" }, - "Role": { - "Fn::GetAtt": [ - "testconstructLambdaFunctionServiceRole435FDF6F", - "Arn" - ] - }, "Environment": { "Variables": { "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehosenoargumentsdestinationfirehose5454CC08" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testconstructLambdaFunctionServiceRole435FDF6F", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -751,109 +751,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json index 7ebdbedd1..11993f843 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json @@ -112,12 +112,6 @@ }, "S3Key": "c7dc0cc1b24bda1d2a5345f61897eee32184906649fdb1de93853c512e129dbf.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "KINESIS_DATASTREAM_NAME": { @@ -126,6 +120,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -168,9 +168,9 @@ "testlambdakinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmC4A0FF00": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -181,9 +181,9 @@ "testlambdakinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm9732E188": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStream.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStream.expected.json index 5b7140b32..aec1e8427 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStream.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStream.expected.json @@ -125,12 +125,6 @@ }, "S3Key": "c7dc0cc1b24bda1d2a5345f61897eee32184906649fdb1de93853c512e129dbf.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", - "Arn" - ] - }, "Environment": { "Variables": { "KINESIS_DATASTREAM_NAME": { @@ -139,6 +133,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -170,9 +170,9 @@ "testlambdakinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmC4A0FF00": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -183,9 +183,9 @@ "testlambdakinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm9732E188": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json index 9bb8057c1..7a8001b89 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json @@ -3,6 +3,7 @@ "testkey784D0285": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -30,8 +31,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -191,12 +191,6 @@ }, "S3Key": "c7dc0cc1b24bda1d2a5345f61897eee32184906649fdb1de93853c512e129dbf.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", - "Arn" - ] - }, "Environment": { "Variables": { "KINESIS_DATASTREAM_NAME": { @@ -205,6 +199,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -236,9 +236,9 @@ "testlambdakinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmC4A0FF00": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -249,9 +249,9 @@ "testlambdakinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm9732E188": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json index cef2eab71..bba6b14da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json @@ -18,9 +18,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -37,7 +34,10 @@ "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -53,15 +53,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -78,12 +78,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -105,15 +105,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -129,9 +129,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -148,7 +145,10 @@ "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -164,15 +164,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -189,12 +189,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -216,15 +216,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -240,9 +240,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -259,7 +256,10 @@ "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -275,15 +275,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -300,12 +300,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -327,15 +327,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -351,9 +351,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -370,21 +367,24 @@ "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -401,21 +401,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -432,21 +429,24 @@ "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -463,21 +463,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -494,21 +491,24 @@ "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -525,12 +525,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -548,11 +548,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "existingVpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "existingVpc/Vpc/FlowLog" } ] }, @@ -646,10 +646,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -660,10 +656,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "existingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -672,6 +672,15 @@ "VpcKINESISSTREAMSC07D91B5": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "existingVpcKINESISSTREAMSsecuritygroupDE0E9DB9", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -684,18 +693,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "existingVpcKINESISSTREAMSsecuritygroupDE0E9DB9", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -707,7 +704,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3": { @@ -863,12 +863,6 @@ }, "S3Key": "c7dc0cc1b24bda1d2a5345f61897eee32184906649fdb1de93853c512e129dbf.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", - "Arn" - ] - }, "Environment": { "Variables": { "KINESIS_DATASTREAM_NAME": { @@ -877,6 +871,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -946,9 +946,9 @@ "testlambdakinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmC4A0FF00": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -959,9 +959,9 @@ "testlambdakinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm9732E188": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newStreamFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newStreamFromProps.expected.json index 8733cc5eb..323c78280 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newStreamFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newStreamFromProps.expected.json @@ -112,12 +112,6 @@ }, "S3Key": "c7dc0cc1b24bda1d2a5345f61897eee32184906649fdb1de93853c512e129dbf.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", - "Arn" - ] - }, "Environment": { "Variables": { "KINESIS_DATASTREAM_NAME": { @@ -126,6 +120,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -170,9 +170,9 @@ "testlambdakinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmC4A0FF00": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -183,9 +183,9 @@ "testlambdakinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm9732E188": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json index 7f798590d..1eddf3e1e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json @@ -153,12 +153,6 @@ }, "S3Key": "c7dc0cc1b24bda1d2a5345f61897eee32184906649fdb1de93853c512e129dbf.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", - "Arn" - ] - }, "Environment": { "Variables": { "KINESIS_DATASTREAM_NAME": { @@ -167,6 +161,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -233,9 +233,9 @@ "testlambdakinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmC4A0FF00": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -246,9 +246,9 @@ "testlambdakinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm9732E188": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -274,9 +274,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -293,21 +290,24 @@ "Key": "Name", "Value": "newVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "newVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -324,9 +324,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -343,21 +340,24 @@ "Key": "Name", "Value": "newVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "newVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -374,9 +374,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -393,21 +390,24 @@ "Key": "Name", "Value": "newVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "newVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -439,7 +439,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc" + "Value": "newVpc/Vpc/FlowLog" } ] } @@ -491,7 +491,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc" + "Value": "newVpc/Vpc/FlowLog" } ] }, @@ -511,10 +511,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -525,10 +521,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc" + "Value": "newVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -537,6 +537,15 @@ "VpcKINESISSTREAMSC07D91B5": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "newVpcKINESISSTREAMSsecuritygroup88F75AD5", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -549,18 +558,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "newVpcKINESISSTREAMSsecuritygroup88F75AD5", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -572,7 +569,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newVpcKINESISSTREAMSsecuritygroup88F75AD5": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json index fd977a1d1..398bfd9be 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json @@ -153,12 +153,6 @@ }, "S3Key": "c7dc0cc1b24bda1d2a5345f61897eee32184906649fdb1de93853c512e129dbf.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", - "Arn" - ] - }, "Environment": { "Variables": { "KINESIS_DATASTREAM_NAME": { @@ -167,6 +161,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -225,9 +225,9 @@ "testlambdakinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmC4A0FF00": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -238,9 +238,9 @@ "testlambdakinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm9732E188": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -266,9 +266,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -285,21 +282,24 @@ "Key": "Name", "Value": "newVpcFromProps/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "newVpcFromProps/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -331,7 +331,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpcFromProps/Vpc" + "Value": "newVpcFromProps/Vpc/FlowLog" } ] } @@ -383,7 +383,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpcFromProps/Vpc" + "Value": "newVpcFromProps/Vpc/FlowLog" } ] }, @@ -403,10 +403,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -417,10 +413,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "newVpcFromProps/Vpc" + "Value": "newVpcFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -429,6 +429,15 @@ "VpcKINESISSTREAMSC07D91B5": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "newVpcFromPropsKINESISSTREAMSsecuritygroup9B3EE931", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -441,24 +450,15 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "newVpcFromPropsKINESISSTREAMSsecuritygroup9B3EE931", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "newVpcFromPropsKINESISSTREAMSsecuritygroup9B3EE931": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json index c79909567..8b55b1488 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json @@ -112,12 +112,6 @@ }, "S3Key": "c7dc0cc1b24bda1d2a5345f61897eee32184906649fdb1de93853c512e129dbf.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", - "Arn" - ] - }, "Environment": { "Variables": { "KINESIS_DATASTREAM_NAME": { @@ -126,6 +120,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdakinesisstreamsLambdaFunctionServiceRole95206CF3", + "Arn" + ] + }, "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -168,9 +168,9 @@ "testlambdakinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmC4A0FF00": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -181,9 +181,9 @@ "testlambdakinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm9732E188": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json index f301d04d5..451416bce 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json @@ -139,12 +139,6 @@ }, "S3Key": "abbc4eca9e7ddabc31da3ce83159e6eee8e72e2c358ab8af0711044514c41290.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -157,6 +151,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -242,9 +242,6 @@ "testlambdaopensearchCognitoUserPoolClient39C21D94": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -262,7 +259,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" + } } }, "testlambdaopensearchCognitoIdentityPool0B1FB311": { @@ -618,9 +618,9 @@ "testlambdaopensearchStatusRedAlarm1627144D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -631,9 +631,9 @@ "testlambdaopensearchStatusYellowAlarm57139CF0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -644,9 +644,9 @@ "testlambdaopensearchFreeStorageSpaceTooLowAlarm6A5E1E96": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -657,9 +657,9 @@ "testlambdaopensearchIndexWritesBlockedTooHighAlarmD2E041A3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -670,9 +670,9 @@ "testlambdaopensearchAutomatedSnapshotFailureTooHighAlarm9A4D0B1F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -683,9 +683,9 @@ "testlambdaopensearchCPUUtilizationTooHighAlarmC4850758": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -696,9 +696,9 @@ "testlambdaopensearchJVMMemoryPressureTooHighAlarmEFB09A7C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -709,9 +709,9 @@ "testlambdaopensearchMasterCPUUtilizationTooHighAlarm124D5748": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -722,9 +722,9 @@ "testlambdaopensearchMasterJVMMemoryPressureTooHighAlarmBC9524D3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -750,9 +750,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -769,21 +766,24 @@ "Key": "Name", "Value": "cluster-config/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "cluster-config/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -800,9 +800,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -819,21 +816,24 @@ "Key": "Name", "Value": "cluster-config/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "cluster-config/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -865,7 +865,7 @@ "Tags": [ { "Key": "Name", - "Value": "cluster-config/Vpc" + "Value": "cluster-config/Vpc/FlowLog" } ] } @@ -917,7 +917,7 @@ "Tags": [ { "Key": "Name", - "Value": "cluster-config/Vpc" + "Value": "cluster-config/Vpc/FlowLog" } ] }, @@ -937,10 +937,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -951,10 +947,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "cluster-config/Vpc" + "Value": "cluster-config/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json index 6e7f1368a..bacca0a29 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json @@ -139,12 +139,6 @@ }, "S3Key": "abbc4eca9e7ddabc31da3ce83159e6eee8e72e2c358ab8af0711044514c41290.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -157,6 +151,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -238,9 +238,6 @@ "testlambdaopensearchCognitoUserPoolClient39C21D94": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -258,7 +255,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" + } } }, "testlambdaopensearchCognitoIdentityPool0B1FB311": { @@ -608,9 +608,9 @@ "testlambdaopensearchStatusRedAlarm1627144D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -621,9 +621,9 @@ "testlambdaopensearchStatusYellowAlarm57139CF0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -634,9 +634,9 @@ "testlambdaopensearchFreeStorageSpaceTooLowAlarm6A5E1E96": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -647,9 +647,9 @@ "testlambdaopensearchIndexWritesBlockedTooHighAlarmD2E041A3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -660,9 +660,9 @@ "testlambdaopensearchAutomatedSnapshotFailureTooHighAlarm9A4D0B1F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -673,9 +673,9 @@ "testlambdaopensearchCPUUtilizationTooHighAlarmC4850758": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -686,9 +686,9 @@ "testlambdaopensearchJVMMemoryPressureTooHighAlarmEFB09A7C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -699,9 +699,9 @@ "testlambdaopensearchMasterCPUUtilizationTooHighAlarm124D5748": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -712,9 +712,9 @@ "testlambdaopensearchMasterJVMMemoryPressureTooHighAlarmBC9524D3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -740,9 +740,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -759,21 +756,24 @@ "Key": "Name", "Value": "disabled-zone-awareness/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "disabled-zone-awareness/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -805,7 +805,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabled-zone-awareness/Vpc" + "Value": "disabled-zone-awareness/Vpc/FlowLog" } ] } @@ -857,7 +857,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabled-zone-awareness/Vpc" + "Value": "disabled-zone-awareness/Vpc/FlowLog" } ] }, @@ -877,10 +877,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -891,10 +887,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "disabled-zone-awareness/Vpc" + "Value": "disabled-zone-awareness/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json index a62047ffa..997380f00 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json @@ -98,12 +98,6 @@ }, "S3Key": "abbc4eca9e7ddabc31da3ce83159e6eee8e72e2c358ab8af0711044514c41290.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -116,6 +110,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -181,9 +181,6 @@ "testlambdaopensearchCognitoUserPoolClient39C21D94": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -201,7 +198,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" + } } }, "testlambdaopensearchCognitoIdentityPool0B1FB311": { @@ -539,9 +539,9 @@ "testlambdaopensearchStatusRedAlarm1627144D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -552,9 +552,9 @@ "testlambdaopensearchStatusYellowAlarm57139CF0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -565,9 +565,9 @@ "testlambdaopensearchFreeStorageSpaceTooLowAlarm6A5E1E96": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -578,9 +578,9 @@ "testlambdaopensearchIndexWritesBlockedTooHighAlarmD2E041A3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -591,9 +591,9 @@ "testlambdaopensearchAutomatedSnapshotFailureTooHighAlarm9A4D0B1F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -604,9 +604,9 @@ "testlambdaopensearchCPUUtilizationTooHighAlarmC4850758": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -617,9 +617,9 @@ "testlambdaopensearchJVMMemoryPressureTooHighAlarmEFB09A7C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -630,9 +630,9 @@ "testlambdaopensearchMasterCPUUtilizationTooHighAlarm124D5748": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -643,9 +643,9 @@ "testlambdaopensearchMasterJVMMemoryPressureTooHighAlarmBC9524D3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json index d15057b56..3115d78a4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json @@ -18,9 +18,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -37,7 +34,10 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -53,15 +53,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -78,12 +78,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -105,15 +105,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -129,9 +129,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -148,7 +145,10 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -164,15 +164,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -189,12 +189,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -216,15 +216,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -240,9 +240,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -259,7 +256,10 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -275,15 +275,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -300,12 +300,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -327,15 +327,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -351,9 +351,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -370,21 +367,24 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -401,21 +401,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -432,21 +429,24 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -463,21 +463,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -494,21 +491,24 @@ "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "existing-vpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -525,12 +525,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -548,11 +548,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "existing-vpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "existing-vpc/Vpc/FlowLog" } ] }, @@ -646,10 +646,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -660,10 +656,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "existing-vpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -806,12 +806,6 @@ "S3Bucket": "cdk-hnb659fds-assets-12345678-test-region", "S3Key": "abbc4eca9e7ddabc31da3ce83159e6eee8e72e2c358ab8af0711044514c41290.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaelasticsearchkibana4LambdaFunctionServiceRoleA52BB7F9", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -824,6 +818,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaelasticsearchkibana4LambdaFunctionServiceRoleA52BB7F9", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -916,9 +916,6 @@ "testlambdaelasticsearchkibana4CognitoUserPoolClientABBF34C4": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaelasticsearchkibana4CognitoUserPool37A5CDE1" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -936,7 +933,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaelasticsearchkibana4CognitoUserPool37A5CDE1" + } } }, "testlambdaelasticsearchkibana4CognitoIdentityPool76EE9793": { @@ -1295,9 +1295,9 @@ "testlambdaelasticsearchkibana4StatusRedAlarm56DEE5C7": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -1308,9 +1308,9 @@ "testlambdaelasticsearchkibana4StatusYellowAlarm810B4F9E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -1321,9 +1321,9 @@ "testlambdaelasticsearchkibana4FreeStorageSpaceTooLowAlarmF3FB31EA": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -1334,9 +1334,9 @@ "testlambdaelasticsearchkibana4IndexWritesBlockedTooHighAlarmF2968C92": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -1347,9 +1347,9 @@ "testlambdaelasticsearchkibana4AutomatedSnapshotFailureTooHighAlarm53EB1ABB": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -1360,9 +1360,9 @@ "testlambdaelasticsearchkibana4CPUUtilizationTooHighAlarm29B67D10": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -1373,9 +1373,9 @@ "testlambdaelasticsearchkibana4JVMMemoryPressureTooHighAlarm9DDED711": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -1386,9 +1386,9 @@ "testlambdaelasticsearchkibana4MasterCPUUtilizationTooHighAlarmE66867F2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -1399,9 +1399,9 @@ "testlambdaelasticsearchkibana4MasterJVMMemoryPressureTooHighAlarm83E1822E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json index 92867fabe..bb4aceef8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json @@ -98,12 +98,6 @@ }, "S3Key": "abbc4eca9e7ddabc31da3ce83159e6eee8e72e2c358ab8af0711044514c41290.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -116,6 +110,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -181,9 +181,6 @@ "testlambdaopensearchCognitoUserPoolClient39C21D94": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -201,7 +198,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" + } } }, "testlambdaopensearchCognitoIdentityPool0B1FB311": { @@ -539,9 +539,9 @@ "testlambdaopensearchStatusRedAlarm1627144D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -552,9 +552,9 @@ "testlambdaopensearchStatusYellowAlarm57139CF0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -565,9 +565,9 @@ "testlambdaopensearchFreeStorageSpaceTooLowAlarm6A5E1E96": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -578,9 +578,9 @@ "testlambdaopensearchIndexWritesBlockedTooHighAlarmD2E041A3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -591,9 +591,9 @@ "testlambdaopensearchAutomatedSnapshotFailureTooHighAlarm9A4D0B1F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -604,9 +604,9 @@ "testlambdaopensearchCPUUtilizationTooHighAlarmC4850758": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -617,9 +617,9 @@ "testlambdaopensearchJVMMemoryPressureTooHighAlarmEFB09A7C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -630,9 +630,9 @@ "testlambdaopensearchMasterCPUUtilizationTooHighAlarm124D5748": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -643,9 +643,9 @@ "testlambdaopensearchMasterJVMMemoryPressureTooHighAlarmBC9524D3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json index d19b26bde..21ebb11c4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json @@ -137,12 +137,6 @@ "S3Bucket": "cdk-hnb659fds-assets-12345678-test-region", "S3Key": "abbc4eca9e7ddabc31da3ce83159e6eee8e72e2c358ab8af0711044514c41290.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -155,6 +149,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaopensearchLambdaFunctionServiceRole4722AB8A", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -244,9 +244,6 @@ "testlambdaopensearchCognitoUserPoolClient39C21D94": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -264,7 +261,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" + } } }, "testlambdaopensearchCognitoIdentityPool0B1FB311": { @@ -623,9 +623,9 @@ "testlambdaopensearchStatusRedAlarm1627144D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -636,9 +636,9 @@ "testlambdaopensearchStatusYellowAlarm57139CF0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -649,9 +649,9 @@ "testlambdaopensearchFreeStorageSpaceTooLowAlarm6A5E1E96": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -662,9 +662,9 @@ "testlambdaopensearchIndexWritesBlockedTooHighAlarmD2E041A3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -675,9 +675,9 @@ "testlambdaopensearchAutomatedSnapshotFailureTooHighAlarm9A4D0B1F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -688,9 +688,9 @@ "testlambdaopensearchCPUUtilizationTooHighAlarmC4850758": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -701,9 +701,9 @@ "testlambdaopensearchJVMMemoryPressureTooHighAlarmEFB09A7C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -714,9 +714,9 @@ "testlambdaopensearchMasterCPUUtilizationTooHighAlarm124D5748": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -727,9 +727,9 @@ "testlambdaopensearchMasterJVMMemoryPressureTooHighAlarmBC9524D3": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -755,9 +755,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/18", "MapPublicIpOnLaunch": false, @@ -774,21 +771,24 @@ "Key": "Name", "Value": "vpc-props/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpc-props/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -805,9 +805,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.64.0/18", "MapPublicIpOnLaunch": false, @@ -824,21 +821,24 @@ "Key": "Name", "Value": "vpc-props/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpc-props/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -855,9 +855,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.128.0/18", "MapPublicIpOnLaunch": false, @@ -874,21 +871,24 @@ "Key": "Name", "Value": "vpc-props/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "vpc-props/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -920,7 +920,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc" + "Value": "vpc-props/Vpc/FlowLog" } ] } @@ -972,7 +972,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc" + "Value": "vpc-props/Vpc/FlowLog" } ] }, @@ -992,10 +992,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1006,10 +1002,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc" + "Value": "vpc-props/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json index 37e83bd90..486e68be1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json @@ -135,12 +135,6 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdas3LambdaFunctionServiceRole72E20379", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -150,6 +144,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdas3LambdaFunctionServiceRole72E20379", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json index b9545b2ce..c0a10dbae 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json @@ -136,12 +136,6 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdas3LambdaFunctionServiceRole72E20379", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -151,6 +145,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdas3LambdaFunctionServiceRole72E20379", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json index 058678598..299acbe25 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json @@ -177,12 +177,6 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdas3LambdaFunctionServiceRole72E20379", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -192,6 +186,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdas3LambdaFunctionServiceRole72E20379", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -357,9 +357,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -376,21 +373,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -407,9 +407,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -426,21 +423,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -457,9 +457,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -476,21 +473,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -522,7 +522,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -594,10 +594,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -608,10 +604,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -620,6 +620,17 @@ "VpcS3A5408339": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "RouteTableIds": [ + { + "Ref": "VpcisolatedSubnet1RouteTableE442650B" + }, + { + "Ref": "VpcisolatedSubnet2RouteTable334F9764" + }, + { + "Ref": "VpcisolatedSubnet3RouteTableA2F6BBC0" + } + ], "ServiceName": { "Fn::Join": [ "", @@ -632,21 +643,10 @@ ] ] }, + "VpcEndpointType": "Gateway", "VpcId": { "Ref": "Vpc8378EB38" - }, - "RouteTableIds": [ - { - "Ref": "VpcisolatedSubnet1RouteTableE442650B" - }, - { - "Ref": "VpcisolatedSubnet2RouteTable334F9764" - }, - { - "Ref": "VpcisolatedSubnet3RouteTableA2F6BBC0" - } - ], - "VpcEndpointType": "Gateway" + } } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json index 36099ea36..fa52e013d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json @@ -136,12 +136,6 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -151,6 +145,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json index 141f895da..03aafe278 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json @@ -143,18 +143,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -336,12 +336,6 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdas3preexistingbucketLambdaFunctionServiceRole9AC7CED0", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -351,6 +345,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdas3preexistingbucketLambdaFunctionServiceRole9AC7CED0", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -380,109 +380,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json index eb40642ed..30b692a1f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json @@ -336,6 +336,7 @@ "testlambdasagemakerEncryptionKey2AACF9E0": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -363,8 +364,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -372,6 +372,9 @@ "testlambdasagemakerSagemakerEndpointConfig6BABA334": { "Type": "AWS::SageMaker::EndpointConfig", "Properties": { + "KmsKeyId": { + "Ref": "testlambdasagemakerEncryptionKey2AACF9E0" + }, "ProductionVariants": [ { "InitialInstanceCount": 1, @@ -385,10 +388,7 @@ }, "VariantName": "AllTraffic" } - ], - "KmsKeyId": { - "Ref": "testlambdasagemakerEncryptionKey2AACF9E0" - } + ] }, "DependsOn": [ "testlambdasagemakerSagemakerModelEC3E4E39" @@ -513,12 +513,6 @@ }, "S3Key": "d894a15aa0242919d44274cbb8ddd33f39cce242789e85e67e642da0a2926e15.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasagemakerLambdaFunctionServiceRole4BA038CB", - "Arn" - ] - }, "Environment": { "Variables": { "SAGEMAKER_ENDPOINT_NAME": { @@ -531,6 +525,12 @@ }, "Handler": "index.handler", "MemorySize": 128, + "Role": { + "Fn::GetAtt": [ + "testlambdasagemakerLambdaFunctionServiceRole4BA038CB", + "Arn" + ] + }, "Runtime": "python3.8", "Timeout": 300, "TracingConfig": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json index e0e998e75..f47a7676d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json @@ -106,12 +106,6 @@ }, "S3Key": "d894a15aa0242919d44274cbb8ddd33f39cce242789e85e67e642da0a2926e15.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "SAGEMAKER_ENDPOINT_NAME": { @@ -124,6 +118,12 @@ }, "Handler": "index.handler", "MemorySize": 128, + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "python3.8", "Timeout": 300, "TracingConfig": { @@ -421,6 +421,7 @@ "testlambdasagemakerEncryptionKey2AACF9E0": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -448,8 +449,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -457,6 +457,9 @@ "testlambdasagemakerSagemakerEndpointConfig6BABA334": { "Type": "AWS::SageMaker::EndpointConfig", "Properties": { + "KmsKeyId": { + "Ref": "testlambdasagemakerEncryptionKey2AACF9E0" + }, "ProductionVariants": [ { "InitialInstanceCount": 1, @@ -470,10 +473,7 @@ }, "VariantName": "AllTraffic" } - ], - "KmsKeyId": { - "Ref": "testlambdasagemakerEncryptionKey2AACF9E0" - } + ] }, "DependsOn": [ "testlambdasagemakerSagemakerModelEC3E4E39" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json index 78d3e1f8f..4625b41a5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json @@ -336,6 +336,7 @@ "EncryptionKey1B843E66": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -363,8 +364,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -372,6 +372,9 @@ "SagemakerEndpointConfig": { "Type": "AWS::SageMaker::EndpointConfig", "Properties": { + "KmsKeyId": { + "Ref": "EncryptionKey1B843E66" + }, "ProductionVariants": [ { "InitialInstanceCount": 1, @@ -385,10 +388,7 @@ }, "VariantName": "AllTraffic" } - ], - "KmsKeyId": { - "Ref": "EncryptionKey1B843E66" - } + ] }, "DependsOn": [ "SagemakerModel" @@ -513,12 +513,6 @@ }, "S3Key": "d894a15aa0242919d44274cbb8ddd33f39cce242789e85e67e642da0a2926e15.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasagemakerLambdaFunctionServiceRole4BA038CB", - "Arn" - ] - }, "Environment": { "Variables": { "SAGEMAKER_ENDPOINT_NAME": { @@ -531,6 +525,12 @@ }, "Handler": "index.handler", "MemorySize": 128, + "Role": { + "Fn::GetAtt": [ + "testlambdasagemakerLambdaFunctionServiceRole4BA038CB", + "Arn" + ] + }, "Runtime": "python3.8", "Timeout": 300, "TracingConfig": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json index abd995aa7..856fc754b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json @@ -109,12 +109,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasecretsmanagerLambdaFunctionServiceRole92CE007F", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -124,6 +118,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasecretsmanagerLambdaFunctionServiceRole92CE007F", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json index 8d0505d94..00399cbea 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,17 +657,31 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSECRETSMANAGERF52907C2": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "deployFunctionWithExistingVpcSECRETSMANAGERsecuritygroupB20BA3EB", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -685,18 +694,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "deployFunctionWithExistingVpcSECRETSMANAGERsecuritygroupB20BA3EB", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -708,7 +705,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testlambdasecretsmanagerstackLambdaFunctionServiceRole4FE7A9C6": { @@ -860,12 +860,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasecretsmanagerstackLambdaFunctionServiceRole4FE7A9C6", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -875,6 +869,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasecretsmanagerstackLambdaFunctionServiceRole4FE7A9C6", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json index b613ac9e0..14093b327 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json @@ -150,12 +150,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasecretsmanagerLambdaFunctionServiceRole92CE007F", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -165,6 +159,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasecretsmanagerLambdaFunctionServiceRole92CE007F", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -253,9 +253,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -272,21 +269,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -303,9 +303,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -322,21 +319,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -353,9 +353,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -372,21 +369,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -418,7 +418,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -470,7 +470,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -490,11 +490,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -505,17 +500,31 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSECRETSMANAGERF52907C2": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "deployFunctionWithVpcSECRETSMANAGERsecuritygroup140A8C59", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -528,18 +537,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "deployFunctionWithVpcSECRETSMANAGERsecuritygroup140A8C59", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -551,7 +548,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "deployFunctionWithVpcSECRETSMANAGERsecuritygroup140A8C59": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json index 377c92c56..b8a7d80e2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json @@ -109,12 +109,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -124,6 +118,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json index 5b7927327..a9056a16a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json @@ -106,12 +106,6 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasnsLambdaFunctionServiceRole9C412F74", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -127,6 +121,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasnsLambdaFunctionServiceRole9C412F74", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json index c9e10345b..fac38e6c5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json @@ -147,12 +147,6 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasnsLambdaFunctionServiceRole9C412F74", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -168,6 +162,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasnsLambdaFunctionServiceRole9C412F74", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -347,9 +347,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -366,21 +363,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -397,9 +397,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -416,21 +413,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -447,9 +447,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -466,21 +463,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -512,7 +512,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -564,7 +564,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -584,11 +584,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -599,17 +594,31 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSNS5B664381": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "deployFunctionWithVpcSNSsecuritygroup5E54C413", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -622,18 +631,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "deployFunctionWithVpcSNSsecuritygroup5E54C413", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -645,7 +642,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "deployFunctionWithVpcSNSsecuritygroup5E54C413": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json index 26ac8d886..a543e3041 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json @@ -106,12 +106,6 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -127,6 +121,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json index ebdcef715..d1e2e4d6e 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json @@ -113,12 +113,6 @@ }, "S3Key": "075b2d402078d97c329028d1af17df69ef86062dc7ace374b10a10022db6fb8d.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqslambdalambdatosqsLambdaFunctionServiceRoleAE4A8DCD", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -128,6 +122,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqslambdalambdatosqsLambdaFunctionServiceRoleAE4A8DCD", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -437,18 +437,18 @@ }, "S3Key": "d685d4fad1e8a913557eb007ae16e135281d3f192a6b557c471e160e3cc557a6.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqslambdasqstolambdaLambdaFunctionServiceRole785979D2", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqslambdasqstolambdaLambdaFunctionServiceRole785979D2", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -480,14 +480,14 @@ "testlambdasqslambdasqstolambdaLambdaFunctionSqsEventSourcedefaultDeploymenttestlambdasqslambdalambdatosqsqueue5E928C6A3AD18AD6": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testlambdasqslambdasqstolambdaLambdaFunction81308327" - }, "EventSourceArn": { "Fn::GetAtt": [ "testlambdasqslambdalambdatosqsqueueF2ED40D2", "Arn" ] + }, + "FunctionName": { + "Ref": "testlambdasqslambdasqstolambdaLambdaFunction81308327" } } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json index 40b1ad280..0118c94c6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json @@ -154,12 +154,6 @@ }, "S3Key": "075b2d402078d97c329028d1af17df69ef86062dc7ace374b10a10022db6fb8d.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqslambdatosqsLambdaFunctionServiceRole9A15D8F5", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -169,6 +163,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqslambdatosqsLambdaFunctionServiceRole9A15D8F5", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -406,9 +406,6 @@ "testlambdasqsVpcisolatedSubnet1Subnet75F315F8": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "testlambdasqsVpc85322AF3" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -425,21 +422,24 @@ "Key": "Name", "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "testlambdasqsVpc85322AF3" + } } }, "testlambdasqsVpcisolatedSubnet1RouteTable9070A207": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "testlambdasqsVpc85322AF3" - }, "Tags": [ { "Key": "Name", "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "testlambdasqsVpc85322AF3" + } } }, "testlambdasqsVpcisolatedSubnet1RouteTableAssociation270A37E8": { @@ -456,9 +456,6 @@ "testlambdasqsVpcisolatedSubnet2Subnet320D7431": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "testlambdasqsVpc85322AF3" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -475,21 +472,24 @@ "Key": "Name", "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "testlambdasqsVpc85322AF3" + } } }, "testlambdasqsVpcisolatedSubnet2RouteTable1C5B9E86": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "testlambdasqsVpc85322AF3" - }, "Tags": [ { "Key": "Name", "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "testlambdasqsVpc85322AF3" + } } }, "testlambdasqsVpcisolatedSubnet2RouteTableAssociation723A8A06": { @@ -506,9 +506,6 @@ "testlambdasqsVpcisolatedSubnet3Subnet34633573": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "testlambdasqsVpc85322AF3" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -525,21 +522,24 @@ "Key": "Name", "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "testlambdasqsVpc85322AF3" + } } }, "testlambdasqsVpcisolatedSubnet3RouteTable7AB1A8FF": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "testlambdasqsVpc85322AF3" - }, "Tags": [ { "Key": "Name", "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "testlambdasqsVpc85322AF3" + } } }, "testlambdasqsVpcisolatedSubnet3RouteTableAssociation41766676": { @@ -571,7 +571,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc" + "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/FlowLog" } ] } @@ -623,7 +623,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc" + "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/FlowLog" } ] }, @@ -643,11 +643,6 @@ "testlambdasqsVpcFlowLogEECF2763": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "testlambdasqsVpc85322AF3" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "testlambdasqsVpcFlowLogIAMRole79FE4957", @@ -658,17 +653,31 @@ "LogGroupName": { "Ref": "testlambdasqsVpcFlowLogLogGroup5E27ADE6" }, + "ResourceId": { + "Ref": "testlambdasqsVpc85322AF3" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc" + "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "testlambdasqsVpcSQS13B88BE1": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "testlambdasqstestlambdasqsSQSsecuritygroupBDBA458D", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -681,18 +690,6 @@ ] ] }, - "VpcId": { - "Ref": "testlambdasqsVpc85322AF3" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "testlambdasqstestlambdasqsSQSsecuritygroupBDBA458D", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "testlambdasqsVpcisolatedSubnet1Subnet75F315F8" @@ -704,7 +701,10 @@ "Ref": "testlambdasqsVpcisolatedSubnet3Subnet34633573" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "testlambdasqsVpc85322AF3" + } } }, "testlambdasqstestlambdasqsSQSsecuritygroupBDBA458D": { @@ -879,18 +879,18 @@ }, "S3Key": "d685d4fad1e8a913557eb007ae16e135281d3f192a6b557c471e160e3cc557a6.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqssqstolambdaLambdaFunctionServiceRoleB914400A", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqssqstolambdaLambdaFunctionServiceRoleB914400A", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -922,14 +922,14 @@ "testlambdasqssqstolambdaLambdaFunctionSqsEventSourcedeployProducerFunctionWithVpctestlambdasqslambdatosqsqueueA1382C56CEF2BFAB": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testlambdasqssqstolambdaLambdaFunctionDE6481E6" - }, "EventSourceArn": { "Fn::GetAtt": [ "testlambdasqslambdatosqsqueue5A401298", "Arn" ] + }, + "FunctionName": { + "Ref": "testlambdasqssqstolambdaLambdaFunctionDE6481E6" } } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json index ce8eeeb53..f3c39b316 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json @@ -115,18 +115,18 @@ }, "S3Key": "d685d4fad1e8a913557eb007ae16e135281d3f192a6b557c471e160e3cc557a6.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -158,14 +158,14 @@ "LambdaFunctionSqsEventSourceexistingConsumerFunctiontestlambdasqslambdalambdatosqsqueue06632F2BBBBAB968": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "LambdaFunctionBF21E41F" - }, "EventSourceArn": { "Fn::GetAtt": [ "testlambdasqslambdalambdatosqsqueueF2ED40D2", "Arn" ] + }, + "FunctionName": { + "Ref": "LambdaFunctionBF21E41F" } } }, @@ -281,12 +281,6 @@ }, "S3Key": "075b2d402078d97c329028d1af17df69ef86062dc7ace374b10a10022db6fb8d.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqslambdalambdatosqsLambdaFunctionServiceRoleAE4A8DCD", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -296,6 +290,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqslambdalambdatosqsLambdaFunctionServiceRoleAE4A8DCD", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json index 8c957b531..db615ee83 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json @@ -113,12 +113,6 @@ }, "S3Key": "075b2d402078d97c329028d1af17df69ef86062dc7ace374b10a10022db6fb8d.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -128,6 +122,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -437,18 +437,18 @@ }, "S3Key": "d685d4fad1e8a913557eb007ae16e135281d3f192a6b557c471e160e3cc557a6.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqslambdasqstolambdaLambdaFunctionServiceRole785979D2", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqslambdasqstolambdaLambdaFunctionServiceRole785979D2", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -480,14 +480,14 @@ "testlambdasqslambdasqstolambdaLambdaFunctionSqsEventSourceexistingProducerFunctiontestlambdasqslambdalambdatosqsqueue9043AC9D03EA33DA": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testlambdasqslambdasqstolambdaLambdaFunction81308327" - }, "EventSourceArn": { "Fn::GetAtt": [ "testlambdasqslambdalambdatosqsqueueF2ED40D2", "Arn" ] + }, + "FunctionName": { + "Ref": "testlambdasqslambdasqstolambdaLambdaFunction81308327" } } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json index f8cfe92f8..0adc3d1f2 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json @@ -192,12 +192,6 @@ }, "S3Key": "075b2d402078d97c329028d1af17df69ef86062dc7ace374b10a10022db6fb8d.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqslambdalambdatosqsLambdaFunctionServiceRoleAE4A8DCD", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -207,6 +201,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqslambdalambdatosqsLambdaFunctionServiceRoleAE4A8DCD", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -349,18 +349,18 @@ }, "S3Key": "d685d4fad1e8a913557eb007ae16e135281d3f192a6b557c471e160e3cc557a6.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqslambdasqstolambdaLambdaFunctionServiceRole785979D2", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqslambdasqstolambdaLambdaFunctionServiceRole785979D2", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -392,14 +392,14 @@ "testlambdasqslambdasqstolambdaLambdaFunctionSqsEventSourceexistingQueueexistingsqsqueue05DEA3674B910AAB": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testlambdasqslambdasqstolambdaLambdaFunction81308327" - }, "EventSourceArn": { "Fn::GetAtt": [ "existingsqsqueue6AE880F4", "Arn" ] + }, + "FunctionName": { + "Ref": "testlambdasqslambdasqstolambdaLambdaFunction81308327" } } } diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json index 966e2d9e8..511e39032 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json @@ -113,12 +113,6 @@ }, "S3Key": "42887c62b1163d790cdb42902037c9f639feb35681616a16826e400c8d1a4435.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqsLambdaFunctionServiceRoleC0430CA8", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -128,6 +122,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqsLambdaFunctionServiceRoleC0430CA8", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json index d54428b69..3aea6b351 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json @@ -154,12 +154,6 @@ }, "S3Key": "42887c62b1163d790cdb42902037c9f639feb35681616a16826e400c8d1a4435.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdasqsLambdaFunctionServiceRoleC0430CA8", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -169,6 +163,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdasqsLambdaFunctionServiceRoleC0430CA8", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -406,9 +406,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -425,21 +422,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -456,9 +456,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -475,21 +472,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -506,9 +506,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -525,21 +522,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -571,7 +571,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -623,7 +623,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -643,11 +643,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -658,17 +653,31 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSQSDF166A88": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "deployFunctionWithVpcSQSsecuritygroup2E4E2685", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -681,18 +690,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "deployFunctionWithVpcSQSsecuritygroup2E4E2685", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -704,7 +701,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "deployFunctionWithVpcSQSsecuritygroup2E4E2685": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json index 9944b622e..c566207bc 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json @@ -113,12 +113,6 @@ }, "S3Key": "42887c62b1163d790cdb42902037c9f639feb35681616a16826e400c8d1a4435.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -128,6 +122,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json index d891590f7..882f39597 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json @@ -131,12 +131,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdassmstringparameterLambdaFunctionServiceRole0E6B5916", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -146,6 +140,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdassmstringparameterLambdaFunctionServiceRole0E6B5916", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json index cb2ca1af1..47c986943 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,17 +657,31 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSSM173B3B5B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "deployFunctionWithExistingVpcSSMsecuritygroupC287F479", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -685,18 +694,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "deployFunctionWithExistingVpcSSMsecuritygroupC287F479", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcPrivateSubnet1Subnet536B997A" @@ -708,7 +705,10 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "testlambdassmstringparameterLambdaFunctionServiceRole0E6B5916": { @@ -882,12 +882,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdassmstringparameterLambdaFunctionServiceRole0E6B5916", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -897,6 +891,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdassmstringparameterLambdaFunctionServiceRole0E6B5916", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json index ac2fa43fa..785fe73e6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json @@ -172,12 +172,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdassmstringparameterLambdaFunctionServiceRole0E6B5916", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -187,6 +181,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdassmstringparameterLambdaFunctionServiceRole0E6B5916", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -264,9 +264,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -283,21 +280,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -314,9 +314,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -333,21 +330,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -364,9 +364,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -383,21 +380,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -429,7 +429,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -481,7 +481,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -501,11 +501,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -516,17 +511,31 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "VpcSSM173B3B5B": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "deployFunctionWithVpcSSMsecuritygroup918CB15C", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -539,18 +548,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "deployFunctionWithVpcSSMsecuritygroup918CB15C", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -562,7 +559,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "deployFunctionWithVpcSSMsecuritygroup918CB15C": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json index c8bcfc575..0d209b92d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json @@ -131,12 +131,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -146,6 +140,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json index 6e184391f..56d6d5a33 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json @@ -138,12 +138,6 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdassmstringparameterLambdaFunctionServiceRole0E6B5916", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -153,6 +147,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdassmstringparameterLambdaFunctionServiceRole0E6B5916", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json index 5d32965b4..251c1aca8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json @@ -135,12 +135,6 @@ "testlambdastepfunctionsconstructStateMachineE1526513": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "testlambdastepfunctionsconstructStateMachineRoleD2891199", - "Arn" - ] - }, "DefinitionString": "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"End\":true}}}", "LoggingConfiguration": { "Destinations": [ @@ -156,6 +150,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "testlambdastepfunctionsconstructStateMachineRoleD2891199", + "Arn" + ] } }, "DependsOn": [ @@ -270,12 +270,6 @@ }, "S3Key": "fd7a741674eeef7951675d2a57f0459376e046d88e5bee9aab601d8f5a704c93.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdastepfunctionsconstructLambdaFunctionServiceRole2D3C3FD0", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -285,6 +279,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdastepfunctionsconstructLambdaFunctionServiceRole2D3C3FD0", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -316,9 +316,8 @@ "testlambdastepfunctionsconstructExecutionFailedAlarm47C759E2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -327,6 +326,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -337,9 +337,8 @@ "testlambdastepfunctionsconstructExecutionThrottledAlarm23275AB5": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -348,6 +347,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -358,9 +358,8 @@ "testlambdastepfunctionsconstructExecutionAbortedAlarm6DBA2A2E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -369,6 +368,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -409,6 +409,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -442,6 +445,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json index 818d0a749..4f7f845e8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json @@ -116,12 +116,6 @@ "testlambdastepfunctionsStateMachine807F0A77": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "testlambdastepfunctionsStateMachineRoleAC728CE7", - "Arn" - ] - }, "DefinitionString": "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"End\":true}}}", "LoggingConfiguration": { "Destinations": [ @@ -137,6 +131,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "testlambdastepfunctionsStateMachineRoleAC728CE7", + "Arn" + ] } }, "DependsOn": [ @@ -292,12 +292,6 @@ }, "S3Key": "fd7a741674eeef7951675d2a57f0459376e046d88e5bee9aab601d8f5a704c93.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdastepfunctionsLambdaFunctionServiceRoleA33E2E9C", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -307,6 +301,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdastepfunctionsLambdaFunctionServiceRoleA33E2E9C", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -362,9 +362,8 @@ "testlambdastepfunctionsExecutionFailedAlarm41073C3F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -373,6 +372,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -383,9 +383,8 @@ "testlambdastepfunctionsExecutionThrottledAlarm62EABDFD": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -394,6 +393,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -404,9 +404,8 @@ "testlambdastepfunctionsExecutionAbortedAlarmC9CB5C2D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -415,6 +414,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -440,9 +440,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -459,21 +456,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -490,9 +490,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -509,21 +506,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -540,9 +540,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -559,21 +556,24 @@ "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -605,7 +605,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -657,7 +657,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -677,10 +677,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -691,10 +687,14 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -703,6 +703,15 @@ "VpcSTEPFUNCTIONS550F8CB6": { "Type": "AWS::EC2::VPCEndpoint", "Properties": { + "PrivateDnsEnabled": true, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "deployFunctionWithVpcSTEPFUNCTIONSsecuritygroupA9CFA360", + "GroupId" + ] + } + ], "ServiceName": { "Fn::Join": [ "", @@ -715,18 +724,6 @@ ] ] }, - "VpcId": { - "Ref": "Vpc8378EB38" - }, - "PrivateDnsEnabled": true, - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "deployFunctionWithVpcSTEPFUNCTIONSsecuritygroupA9CFA360", - "GroupId" - ] - } - ], "SubnetIds": [ { "Ref": "VpcisolatedSubnet1SubnetE62B1B9B" @@ -738,7 +735,10 @@ "Ref": "VpcisolatedSubnet3Subnet44F2537D" } ], - "VpcEndpointType": "Interface" + "VpcEndpointType": "Interface", + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "deployFunctionWithVpcSTEPFUNCTIONSsecuritygroupA9CFA360": { @@ -832,6 +832,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -865,6 +868,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json index 1d02f85e7..76331499d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json @@ -105,12 +105,6 @@ }, "S3Key": "fd7a741674eeef7951675d2a57f0459376e046d88e5bee9aab601d8f5a704c93.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -120,6 +114,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -263,12 +263,6 @@ "testlambdastepfunctionsconstructStateMachineE1526513": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "testlambdastepfunctionsconstructStateMachineRoleD2891199", - "Arn" - ] - }, "DefinitionString": "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"End\":true}}}", "LoggingConfiguration": { "Destinations": [ @@ -284,6 +278,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "testlambdastepfunctionsconstructStateMachineRoleD2891199", + "Arn" + ] } }, "DependsOn": [ @@ -296,9 +296,8 @@ "testlambdastepfunctionsconstructExecutionFailedAlarm47C759E2": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -307,6 +306,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -317,9 +317,8 @@ "testlambdastepfunctionsconstructExecutionThrottledAlarm23275AB5": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -328,6 +327,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -338,9 +338,8 @@ "testlambdastepfunctionsconstructExecutionAbortedAlarm6DBA2A2E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -349,6 +348,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -389,6 +389,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -422,6 +425,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json index ca1dc60f2..90ce56cf6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json @@ -99,13 +99,13 @@ }, "S3Key": "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df.zip" }, + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "LambdaFunctionServiceRole0C4CDE0B", "Arn" ] }, - "Handler": "index.handler", "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -269,14 +269,14 @@ }, "S3Key": "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50.zip" }, + "FunctionName": "PhotosLambdaTestFromAsset", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "PhotosLambdaTestFromAssetServiceRoleE0B4776B", "Arn" ] }, - "FunctionName": "PhotosLambdaTestFromAsset", - "Handler": "index.handler", "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -552,14 +552,14 @@ }, "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" }, + "Handler": "index.handler", + "MemorySize": 1024, "Role": { "Fn::GetAtt": [ "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014", "Arn" ] }, - "Handler": "index.handler", - "MemorySize": 1024, "Runtime": "nodejs18.x", "Timeout": 60, "TracingConfig": { @@ -669,13 +669,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" - }, - "Role": { - "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", - "Arn" - ] + "S3Key": "7382a0addb9f34974a1ea6c6c9b063882af874828f366f5c93b2b7b64db15c94.zip" }, "Description": "AWS CDK resource provider framework - onEvent (apiFromAssetExistingLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", "Environment": { @@ -689,7 +683,13 @@ } }, "Handler": "framework.onEvent", - "Runtime": "nodejs14.x", + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", + "Arn" + ] + }, + "Runtime": "nodejs18.x", "Timeout": 900 }, "DependsOn": [ @@ -832,10 +832,10 @@ "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775114a8d1d0c9bf9b9d904a22f099d1d64": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" - }, - "Description": "Automatically created by the RestApi construct" + } }, "Metadata": { "cfn_nag": { @@ -851,9 +851,6 @@ "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -874,6 +871,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, "StageName": "prod", "TracingEnabled": true } @@ -1030,4 +1030,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json index 9061a24b2..22cc311a0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json @@ -99,13 +99,13 @@ }, "S3Key": "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df.zip" }, + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9", "Arn" ] }, - "Handler": "index.handler", "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -269,13 +269,13 @@ }, "S3Key": "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50.zip" }, + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749", "Arn" ] }, - "Handler": "index.handler", "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -551,14 +551,14 @@ }, "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" }, + "Handler": "index.handler", + "MemorySize": 1024, "Role": { "Fn::GetAtt": [ "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014", "Arn" ] }, - "Handler": "index.handler", - "MemorySize": 1024, "Runtime": "nodejs18.x", "Timeout": 60, "TracingConfig": { @@ -668,13 +668,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" - }, - "Role": { - "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", - "Arn" - ] + "S3Key": "7382a0addb9f34974a1ea6c6c9b063882af874828f366f5c93b2b7b64db15c94.zip" }, "Description": "AWS CDK resource provider framework - onEvent (apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", "Environment": { @@ -688,7 +682,13 @@ } }, "Handler": "framework.onEvent", - "Runtime": "nodejs14.x", + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", + "Arn" + ] + }, + "Runtime": "nodejs18.x", "Timeout": 900 }, "DependsOn": [ @@ -831,10 +831,10 @@ "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775c586d865ce613dde0b09710274a96485": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" - }, - "Description": "Automatically created by the RestApi construct" + } }, "Metadata": { "cfn_nag": { @@ -850,9 +850,6 @@ "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -873,6 +870,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, "StageName": "prod", "TracingEnabled": true } @@ -1029,4 +1029,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json index 183f298d9..c888345b9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json @@ -99,13 +99,13 @@ }, "S3Key": "8ce85d10dcd7b8e6d43ffd909827afc76802ad40fcd7908886ff825cbe8e15df.zip" }, + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "OpenApiGatewayToLambdaMessagesHandlerApiFunction0ServiceRoleB5DC63A9", "Arn" ] }, - "Handler": "index.handler", "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -269,13 +269,13 @@ }, "S3Key": "654d49d4ea47a6be417d57b94dc0310933d0e971a3e48a3080c3e48487af3e50.zip" }, + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "OpenApiGatewayToLambdaPhotosHandlerApiFunction1ServiceRoleA572C749", "Arn" ] }, - "Handler": "index.handler", "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -551,14 +551,14 @@ }, "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" }, + "Handler": "index.handler", + "MemorySize": 1024, "Role": { "Fn::GetAtt": [ "OpenApiGatewayToLambdaApiTemplateWriterLambdaRoleCBDA4014", "Arn" ] }, - "Handler": "index.handler", - "MemorySize": 1024, "Runtime": "nodejs18.x", "Timeout": 60, "TracingConfig": { @@ -668,13 +668,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" - }, - "Role": { - "Fn::GetAtt": [ - "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", - "Arn" - ] + "S3Key": "7382a0addb9f34974a1ea6c6c9b063882af874828f366f5c93b2b7b64db15c94.zip" }, "Description": "AWS CDK resource provider framework - onEvent (apiFromAssetWithCognitoAuth/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", "Environment": { @@ -688,7 +682,13 @@ } }, "Handler": "framework.onEvent", - "Runtime": "nodejs14.x", + "Role": { + "Fn::GetAtt": [ + "OpenApiGatewayToLambdaApiTemplateWriterProviderframeworkonEventServiceRoleFEE201A1", + "Arn" + ] + }, + "Runtime": "nodejs18.x", "Timeout": 900 }, "DependsOn": [ @@ -831,10 +831,10 @@ "OpenApiGatewayToLambdaSpecRestApiDeploymentC8BD0775d25e717744ab7d508aee3a1c3b7aa9b2": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" - }, - "Description": "Automatically created by the RestApi construct" + } }, "Metadata": { "cfn_nag": { @@ -850,9 +850,6 @@ "OpenApiGatewayToLambdaSpecRestApiDeploymentStageprodB962CBBB": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -873,6 +870,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "OpenApiGatewayToLambdaSpecRestApi27C18064" + }, "StageName": "prod", "TracingEnabled": true } @@ -1029,4 +1029,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json index 7cc0131dc..5d0d3bb46 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json @@ -326,8 +326,6 @@ "privateapistackprivateapistackalias54E3713F": { "Type": "AWS::Route53::RecordSet", "Properties": { - "Name": "www.example.com.", - "Type": "A", "AliasTarget": { "DNSName": { "Fn::Join": [ @@ -352,7 +350,9 @@ }, "HostedZoneId": { "Ref": "privateapistackprivateapistackzone3E5194E7" - } + }, + "Name": "www.example.com.", + "Type": "A" } }, "Vpc8378EB38": { @@ -373,9 +373,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -392,21 +389,24 @@ "Key": "Name", "Value": "deployPrivateApi/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPrivateApi/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -423,9 +423,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -442,21 +439,24 @@ "Key": "Name", "Value": "deployPrivateApi/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPrivateApi/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -473,9 +473,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -492,21 +489,24 @@ "Key": "Name", "Value": "deployPrivateApi/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPrivateApi/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -538,7 +538,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc" + "Value": "deployPrivateApi/Vpc/FlowLog" } ] } @@ -590,7 +590,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc" + "Value": "deployPrivateApi/Vpc/FlowLog" } ] }, @@ -610,11 +610,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -625,12 +620,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc" + "Value": "deployPrivateApi/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { @@ -662,18 +662,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json index 2d1df8163..3a56327aa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc" + "Value": "deployPrivateApiExistingZone/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc" + "Value": "deployPrivateApiExistingZone/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,12 +657,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc" + "Value": "deployPrivateApiExistingZone/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "newzone1D011936": { @@ -995,8 +995,6 @@ "existingzonestackexistingzonestackalias77D2E65D": { "Type": "AWS::Route53::RecordSet", "Properties": { - "Name": "www.test-example.com.", - "Type": "A", "AliasTarget": { "DNSName": { "Fn::Join": [ @@ -1021,7 +1019,9 @@ }, "HostedZoneId": { "Ref": "newzone1D011936" - } + }, + "Name": "www.test-example.com.", + "Type": "A" } }, "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { @@ -1053,18 +1053,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiExistingAlb.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiExistingAlb.expected.json index 6bc4a720c..b9cf81aa1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiExistingAlb.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiExistingAlb.expected.json @@ -19,9 +19,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -38,7 +35,10 @@ "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -54,15 +54,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -79,12 +79,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -106,15 +106,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -130,9 +130,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -149,7 +146,10 @@ "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -165,15 +165,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -190,12 +190,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -217,15 +217,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -241,9 +241,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -260,7 +257,10 @@ "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -276,15 +276,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -301,12 +301,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -328,15 +328,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -352,9 +352,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -371,21 +368,24 @@ "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -402,21 +402,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -433,21 +430,24 @@ "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -464,21 +464,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -495,21 +492,24 @@ "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -526,12 +526,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -549,11 +549,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc" + "Value": "deployPublicApiExistingAlb/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc" + "Value": "deployPublicApiExistingAlb/Vpc/FlowLog" } ] }, @@ -647,11 +647,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -662,12 +657,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc" + "Value": "deployPublicApiExistingAlb/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "newzone1D011936": { @@ -749,8 +749,6 @@ "publicapistackpublicapistackalias4096038C": { "Type": "AWS::Route53::RecordSet", "Properties": { - "Name": "www.test-example.com.", - "Type": "A", "AliasTarget": { "DNSName": { "Fn::Join": [ @@ -775,7 +773,9 @@ }, "HostedZoneId": { "Ref": "newzone1D011936" - } + }, + "Name": "www.test-example.com.", + "Type": "A" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json index 9e5b5818b..609c4a6d2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json @@ -324,8 +324,6 @@ "newalbstacknewalbstackalias05E0DF53": { "Type": "AWS::Route53::RecordSet", "Properties": { - "Name": "www.test-example.com.", - "Type": "A", "AliasTarget": { "DNSName": { "Fn::Join": [ @@ -350,7 +348,9 @@ }, "HostedZoneId": { "Ref": "newzone1D011936" - } + }, + "Name": "www.test-example.com.", + "Type": "A" } }, "Vpc8378EB38": { @@ -371,9 +371,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/19", "MapPublicIpOnLaunch": true, @@ -390,7 +387,10 @@ "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -406,15 +406,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -431,12 +431,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -458,15 +458,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -482,9 +482,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.32.0/19", "MapPublicIpOnLaunch": true, @@ -501,7 +498,10 @@ "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -517,15 +517,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -542,12 +542,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -569,15 +569,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -593,9 +593,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.64.0/19", "MapPublicIpOnLaunch": true, @@ -612,7 +609,10 @@ "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -628,15 +628,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -653,12 +653,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -680,15 +680,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -704,9 +704,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.96.0/19", "MapPublicIpOnLaunch": false, @@ -723,21 +720,24 @@ "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -754,21 +754,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.128.0/19", "MapPublicIpOnLaunch": false, @@ -785,21 +782,24 @@ "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -816,21 +816,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.160.0/19", "MapPublicIpOnLaunch": false, @@ -847,21 +844,24 @@ "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -878,12 +878,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -901,11 +901,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -927,7 +927,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc" + "Value": "deployPublicApiNewAlb/Vpc/FlowLog" } ] } @@ -979,7 +979,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc" + "Value": "deployPublicApiNewAlb/Vpc/FlowLog" } ] }, @@ -999,11 +999,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -1014,12 +1009,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc" + "Value": "deployPublicApiNewAlb/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { @@ -1051,18 +1051,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "e57c1acaa363d7d2b81736776007a7091bc73dff4aeb8135627c4511a51e7dca.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployWithoutLogging.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployWithoutLogging.expected.json index 2c42249ee..47d84e1f8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployWithoutLogging.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployWithoutLogging.expected.json @@ -88,8 +88,6 @@ "nologgingstacknologgingstackalias0D6EE5FC": { "Type": "AWS::Route53::RecordSet", "Properties": { - "Name": "www.example.com.", - "Type": "A", "AliasTarget": { "DNSName": { "Fn::Join": [ @@ -114,7 +112,9 @@ }, "HostedZoneId": { "Ref": "nologgingstacknologgingstackzoneE11B9175" - } + }, + "Name": "www.example.com.", + "Type": "A" } }, "Vpc8378EB38": { @@ -135,9 +135,6 @@ "VpcisolatedSubnet1SubnetE62B1B9B": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "10.0.0.0/18", "MapPublicIpOnLaunch": false, @@ -154,21 +151,24 @@ "Key": "Name", "Value": "deployWithoutLogging/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableE442650B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployWithoutLogging/Vpc/isolatedSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet1RouteTableAssociationD259E31A": { @@ -185,9 +185,6 @@ "VpcisolatedSubnet2Subnet39217055": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "10.0.64.0/18", "MapPublicIpOnLaunch": false, @@ -204,21 +201,24 @@ "Key": "Name", "Value": "deployWithoutLogging/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTable334F9764": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployWithoutLogging/Vpc/isolatedSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet2RouteTableAssociation25A4716F": { @@ -235,9 +235,6 @@ "VpcisolatedSubnet3Subnet44F2537D": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "10.0.128.0/18", "MapPublicIpOnLaunch": false, @@ -254,21 +251,24 @@ "Key": "Name", "Value": "deployWithoutLogging/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableA2F6BBC0": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "deployWithoutLogging/Vpc/isolatedSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcisolatedSubnet3RouteTableAssociationDC010BEB": { @@ -300,7 +300,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc" + "Value": "deployWithoutLogging/Vpc/FlowLog" } ] } @@ -352,7 +352,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc" + "Value": "deployWithoutLogging/Vpc/FlowLog" } ] }, @@ -372,11 +372,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -387,12 +382,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc" + "Value": "deployWithoutLogging/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json index 78f15a1ef..dfad072b0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json @@ -197,18 +197,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -342,18 +342,18 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "tests3lambdaLambdaFunctionServiceRoleA74F4427", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "tests3lambdaLambdaFunctionServiceRoleA74F4427", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -485,109 +485,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json index c60da90fa..400d8c050 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json @@ -98,18 +98,18 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "tests3lambdaLambdaFunctionServiceRoleA74F4427", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "tests3lambdaLambdaFunctionServiceRoleA74F4427", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json index a47e32a2a..678527ff8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json @@ -242,6 +242,7 @@ "tests3snsEncryptionKey6C553584": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -280,8 +281,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json index ff8376880..a21e54624 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json @@ -173,18 +173,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -223,6 +223,7 @@ "tests3snsEncryptionKey6C553584": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -261,8 +262,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -486,109 +486,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json index 2182fa528..354335412 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json @@ -3,6 +3,7 @@ "EncryptionKey1B843E66": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -41,8 +42,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json index fe7840adc..da9251c4a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json @@ -242,6 +242,7 @@ "tests3snsEncryptionKey6C553584": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -280,8 +281,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json index a47e32a2a..678527ff8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json @@ -242,6 +242,7 @@ "tests3snsEncryptionKey6C553584": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -280,8 +281,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json index 1608bdc30..618503467 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json @@ -256,6 +256,7 @@ "tests3snsEncryptionKey6C553584": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -294,8 +295,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.creatingNewQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.creatingNewQueue.expected.json index c839ae628..34cf2729f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.creatingNewQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.creatingNewQueue.expected.json @@ -4,6 +4,7 @@ "ImportedEncryptionKeyBE10B2FC": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -65,8 +66,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json index 2406f51ef..a6927de0a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json @@ -325,6 +325,7 @@ "tests3sqsEncryptionKeyFD4D5946": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -386,8 +387,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json index 87a76dc7c..3e9c4bdc5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json @@ -178,18 +178,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -494,6 +494,7 @@ "tests3sqstempEncryptionKey57CC85E2": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -555,8 +556,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -784,109 +784,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingQueue.expected.json index 80b3fd0ad..cd1ee5d07 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingQueue.expected.json @@ -3,6 +3,7 @@ "EncryptionKey1B843E66": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -64,8 +65,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json index 8cf18e55b..c6b3e9b5b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json @@ -176,18 +176,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -305,6 +305,7 @@ "tests3sqsEncryptionKeyFD4D5946": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -366,8 +367,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -595,109 +595,6 @@ } } }, - "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - } - }, "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json index 4df7ea0f0..1fe822f96 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json @@ -324,6 +324,7 @@ "tests3sqsEncryptionKeyFD4D5946": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -385,8 +386,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json index 11241541f..39116fa34 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json @@ -342,12 +342,6 @@ "tests3stepfunctionstests3stepfunctionseventrulestepfunctionconstructStateMachine67197269": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "tests3stepfunctionstests3stepfunctionseventrulestepfunctionconstructStateMachineRoleEAF485A9", - "Arn" - ] - }, "DefinitionString": "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"End\":true}}}", "LoggingConfiguration": { "Destinations": [ @@ -363,6 +357,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "tests3stepfunctionstests3stepfunctionseventrulestepfunctionconstructStateMachineRoleEAF485A9", + "Arn" + ] } }, "DependsOn": [ @@ -452,9 +452,8 @@ "tests3stepfunctionstests3stepfunctionseventrulestepfunctionconstructExecutionFailedAlarm9C7AF57A": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -463,6 +462,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -473,9 +473,8 @@ "tests3stepfunctionstests3stepfunctionseventrulestepfunctionconstructExecutionThrottledAlarm99D8FF54": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -484,6 +483,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -494,9 +494,8 @@ "tests3stepfunctionstests3stepfunctionseventrulestepfunctionconstructExecutionAbortedAlarm1689CFA6": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -505,6 +504,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -647,6 +647,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -680,6 +683,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json index 75e7f4052..d6d2e344a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json @@ -160,18 +160,18 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" }, "Timeout": 900, "MemorySize": 128, - "Handler": "__entrypoint__.handler", + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", "Arn" ] }, - "Runtime": "nodejs16.x", + "Runtime": "nodejs18.x", "Description": { "Fn::Join": [ "", @@ -424,12 +424,6 @@ "tests3stepfunctionspreexistingbucketconstructtests3stepfunctionspreexistingbucketconstructeventrulestepfunctionconstructStateMachine326BB1C1": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "tests3stepfunctionspreexistingbucketconstructtests3stepfunctionspreexistingbucketconstructeventrulestepfunctionconstructStateMachineRoleE56A7030", - "Arn" - ] - }, "DefinitionString": "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"End\":true}}}", "LoggingConfiguration": { "Destinations": [ @@ -445,6 +439,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "tests3stepfunctionspreexistingbucketconstructtests3stepfunctionspreexistingbucketconstructeventrulestepfunctionconstructStateMachineRoleE56A7030", + "Arn" + ] } }, "DependsOn": [ @@ -534,9 +534,8 @@ "tests3stepfunctionspreexistingbucketconstructtests3stepfunctionspreexistingbucketconstructeventrulestepfunctionconstructExecutionFailedAlarmAC11687E": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -545,6 +544,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -555,9 +555,8 @@ "tests3stepfunctionspreexistingbucketconstructtests3stepfunctionspreexistingbucketconstructeventrulestepfunctionconstructExecutionThrottledAlarm630846CA": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -566,6 +565,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -576,9 +576,8 @@ "tests3stepfunctionspreexistingbucketconstructtests3stepfunctionspreexistingbucketconstructeventrulestepfunctionconstructExecutionAbortedAlarmB47B3FC8": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -587,6 +586,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -596,107 +596,6 @@ } }, "Mappings": { - "DefaultCrNodeVersionMap": { - "af-south-1": { - "value": "nodejs16.x" - }, - "ap-east-1": { - "value": "nodejs16.x" - }, - "ap-northeast-1": { - "value": "nodejs16.x" - }, - "ap-northeast-2": { - "value": "nodejs16.x" - }, - "ap-northeast-3": { - "value": "nodejs16.x" - }, - "ap-south-1": { - "value": "nodejs16.x" - }, - "ap-south-2": { - "value": "nodejs16.x" - }, - "ap-southeast-1": { - "value": "nodejs16.x" - }, - "ap-southeast-2": { - "value": "nodejs16.x" - }, - "ap-southeast-3": { - "value": "nodejs16.x" - }, - "ca-central-1": { - "value": "nodejs16.x" - }, - "cn-north-1": { - "value": "nodejs16.x" - }, - "cn-northwest-1": { - "value": "nodejs16.x" - }, - "eu-central-1": { - "value": "nodejs16.x" - }, - "eu-central-2": { - "value": "nodejs16.x" - }, - "eu-north-1": { - "value": "nodejs16.x" - }, - "eu-south-1": { - "value": "nodejs16.x" - }, - "eu-south-2": { - "value": "nodejs16.x" - }, - "eu-west-1": { - "value": "nodejs16.x" - }, - "eu-west-2": { - "value": "nodejs16.x" - }, - "eu-west-3": { - "value": "nodejs16.x" - }, - "me-central-1": { - "value": "nodejs16.x" - }, - "me-south-1": { - "value": "nodejs16.x" - }, - "sa-east-1": { - "value": "nodejs16.x" - }, - "us-east-1": { - "value": "nodejs16.x" - }, - "us-east-2": { - "value": "nodejs16.x" - }, - "us-gov-east-1": { - "value": "nodejs16.x" - }, - "us-gov-west-1": { - "value": "nodejs16.x" - }, - "us-iso-east-1": { - "value": "nodejs14.x" - }, - "us-iso-west-1": { - "value": "nodejs14.x" - }, - "us-isob-east-1": { - "value": "nodejs14.x" - }, - "us-west-1": { - "value": "nodejs16.x" - }, - "us-west-2": { - "value": "nodejs16.x" - } - }, "ServiceprincipalMap": { "af-south-1": { "states": "states.af-south-1.amazonaws.com" @@ -728,6 +627,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -761,6 +663,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json index c2d6d28e0..a0a1c4e60 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json @@ -248,12 +248,6 @@ "tests3stepfunctionsconstructtests3stepfunctionsconstructeventrulestepfunctionconstructStateMachineCC5D0DD7": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { - "RoleArn": { - "Fn::GetAtt": [ - "tests3stepfunctionsconstructtests3stepfunctionsconstructeventrulestepfunctionconstructStateMachineRole29FAFE92", - "Arn" - ] - }, "DefinitionString": "{\"StartAt\":\"StartState\",\"States\":{\"StartState\":{\"Type\":\"Pass\",\"End\":true}}}", "LoggingConfiguration": { "Destinations": [ @@ -269,6 +263,12 @@ } ], "Level": "ERROR" + }, + "RoleArn": { + "Fn::GetAtt": [ + "tests3stepfunctionsconstructtests3stepfunctionsconstructeventrulestepfunctionconstructStateMachineRole29FAFE92", + "Arn" + ] } }, "DependsOn": [ @@ -358,9 +358,8 @@ "tests3stepfunctionsconstructtests3stepfunctionsconstructeventrulestepfunctionconstructExecutionFailedAlarm511B7A93": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that failed exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -369,6 +368,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsFailed", "Namespace": "AWS/States", "Period": 300, @@ -379,9 +379,8 @@ "tests3stepfunctionsconstructtests3stepfunctionsconstructeventrulestepfunctionconstructExecutionThrottledAlarmF97ADDFF": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that throttled exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -390,6 +389,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionThrottled", "Namespace": "AWS/States", "Period": 300, @@ -400,9 +400,8 @@ "tests3stepfunctionsconstructtests3stepfunctionsconstructeventrulestepfunctionconstructExecutionAbortedAlarm8B04A073": { "Type": "AWS::CloudWatch::Alarm", "Properties": { - "ComparisonOperator": "GreaterThanOrEqualToThreshold", - "EvaluationPeriods": 1, "AlarmDescription": "Alarm for the number of executions that aborted exceeded the threshold of 1. ", + "ComparisonOperator": "GreaterThanOrEqualToThreshold", "Dimensions": [ { "Name": "StateMachineArn", @@ -411,6 +410,7 @@ } } ], + "EvaluationPeriods": 1, "MetricName": "ExecutionsAborted", "Namespace": "AWS/States", "Period": 300, @@ -553,6 +553,9 @@ "ap-southeast-3": { "states": "states.ap-southeast-3.amazonaws.com" }, + "ap-southeast-4": { + "states": "states.ap-southeast-4.amazonaws.com" + }, "ca-central-1": { "states": "states.ca-central-1.amazonaws.com" }, @@ -586,6 +589,9 @@ "eu-west-3": { "states": "states.eu-west-3.amazonaws.com" }, + "il-central-1": { + "states": "states.il-central-1.amazonaws.com" + }, "me-central-1": { "states": "states.me-central-1.amazonaws.com" }, diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json index d96ac9479..0eea518ec 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json @@ -99,18 +99,18 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testsnslambdaLambdaFunctionServiceRole23794781", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testsnslambdaLambdaFunctionServiceRole23794781", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -158,15 +158,15 @@ "testsnslambdaLambdaFunctionSnsTopic9C14F333": { "Type": "AWS::SNS::Subscription", "Properties": { - "Protocol": "lambda", - "TopicArn": { - "Ref": "testsnslambdaSnsTopic52CA159E" - }, "Endpoint": { "Fn::GetAtt": [ "testsnslambdaLambdaFunctionEE9A249B", "Arn" ] + }, + "Protocol": "lambda", + "TopicArn": { + "Ref": "testsnslambdaSnsTopic52CA159E" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json index b74d97aac..ffc3c0676 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json @@ -115,18 +115,18 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "testsqslambdafifoLambdaFunctionServiceRole74463822", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testsqslambdafifoLambdaFunctionServiceRole74463822", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -158,14 +158,14 @@ "testsqslambdafifoLambdaFunctionSqsEventSourcedeployFifoQueuetestsqslambdafifoqueue90CAB7D6AF891A0A": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testsqslambdafifoLambdaFunction0F3AE705" - }, "EventSourceArn": { "Fn::GetAtt": [ "testsqslambdafifoqueue45DD24D7", "Arn" ] + }, + "FunctionName": { + "Ref": "testsqslambdafifoLambdaFunction0F3AE705" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json index 76909919a..dcc3a8016 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json @@ -115,18 +115,18 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "testsqslambdaLambdaFunctionServiceRoleF623B438", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testsqslambdaLambdaFunctionServiceRoleF623B438", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -158,14 +158,14 @@ "testsqslambdaLambdaFunctionSqsEventSourcedeployFunctiontestsqslambdaqueueC37BE757C660F26A": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testsqslambdaLambdaFunction58720146" - }, "EventSourceArn": { "Fn::GetAtt": [ "testsqslambdaqueue601203B8", "Arn" ] + }, + "FunctionName": { + "Ref": "testsqslambdaLambdaFunction58720146" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json index b573f41ee..8f53e1154 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json @@ -115,18 +115,18 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -158,14 +158,14 @@ "LambdaFunctionSqsEventSourceexistingFunctiontestsqslambdaqueue15248716FB07DA49": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "LambdaFunctionBF21E41F" - }, "EventSourceArn": { "Fn::GetAtt": [ "testsqslambdaqueue601203B8", "Arn" ] + }, + "FunctionName": { + "Ref": "LambdaFunctionBF21E41F" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.no-arguments.expected.json index 2271e0bbb..575dddfb3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.no-arguments.expected.json @@ -18,9 +18,6 @@ "VpcPublicSubnet1Subnet5C2D37C4": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.0.0/19", "MapPublicIpOnLaunch": true, @@ -37,7 +34,10 @@ "Key": "Name", "Value": "no-arguments/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -53,15 +53,15 @@ "VpcPublicSubnet1RouteTable6C95E38E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-arguments/Vpc/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet1RouteTableAssociation97140677": { @@ -78,12 +78,12 @@ "VpcPublicSubnet1DefaultRoute3DA9E72A": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet1RouteTable6C95E38E" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" } }, "DependsOn": [ @@ -105,15 +105,15 @@ "VpcPublicSubnet1NATGateway4D7517AA": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet1Subnet5C2D37C4" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet1EIPD7E02669", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, "Tags": [ { "Key": "Name", @@ -129,9 +129,6 @@ "VpcPublicSubnet2Subnet691E08A3": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.32.0/19", "MapPublicIpOnLaunch": true, @@ -148,7 +145,10 @@ "Key": "Name", "Value": "no-arguments/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -164,15 +164,15 @@ "VpcPublicSubnet2RouteTable94F7E489": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-arguments/Vpc/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet2RouteTableAssociationDD5762D8": { @@ -189,12 +189,12 @@ "VpcPublicSubnet2DefaultRoute97F91067": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet2RouteTable94F7E489" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" } }, "DependsOn": [ @@ -216,15 +216,15 @@ "VpcPublicSubnet2NATGateway9182C01D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet2Subnet691E08A3" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet2EIP3C605A87", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, "Tags": [ { "Key": "Name", @@ -240,9 +240,6 @@ "VpcPublicSubnet3SubnetBE12F0B6": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.64.0/19", "MapPublicIpOnLaunch": true, @@ -259,7 +256,10 @@ "Key": "Name", "Value": "no-arguments/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } }, "Metadata": { "cfn_nag": { @@ -275,15 +275,15 @@ "VpcPublicSubnet3RouteTable93458DBB": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-arguments/Vpc/PublicSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPublicSubnet3RouteTableAssociation1F1EDF02": { @@ -300,12 +300,12 @@ "VpcPublicSubnet3DefaultRoute4697774F": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPublicSubnet3RouteTable93458DBB" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "RouteTableId": { + "Ref": "VpcPublicSubnet3RouteTable93458DBB" } }, "DependsOn": [ @@ -327,15 +327,15 @@ "VpcPublicSubnet3NATGateway7640CD1D": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VpcPublicSubnet3SubnetBE12F0B6" - }, "AllocationId": { "Fn::GetAtt": [ "VpcPublicSubnet3EIP3A666A23", "AllocationId" ] }, + "SubnetId": { + "Ref": "VpcPublicSubnet3SubnetBE12F0B6" + }, "Tags": [ { "Key": "Name", @@ -351,9 +351,6 @@ "VpcPrivateSubnet1Subnet536B997A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1a", "CidrBlock": "172.168.96.0/19", "MapPublicIpOnLaunch": false, @@ -370,21 +367,24 @@ "Key": "Name", "Value": "no-arguments/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableB2C5B500": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-arguments/Vpc/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { @@ -401,21 +401,18 @@ "VpcPrivateSubnet1DefaultRouteBE02A9ED": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" } } }, "VpcPrivateSubnet2Subnet3788AAA1": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1b", "CidrBlock": "172.168.128.0/19", "MapPublicIpOnLaunch": false, @@ -432,21 +429,24 @@ "Key": "Name", "Value": "no-arguments/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableA678073B": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-arguments/Vpc/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { @@ -463,21 +463,18 @@ "VpcPrivateSubnet2DefaultRoute060D2087": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet2RouteTableA678073B" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet2NATGateway9182C01D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" } } }, "VpcPrivateSubnet3SubnetF258B56E": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "AvailabilityZone": "test-region-1c", "CidrBlock": "172.168.160.0/19", "MapPublicIpOnLaunch": false, @@ -494,21 +491,24 @@ "Key": "Name", "Value": "no-arguments/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableD98824C7": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "Tags": [ { "Key": "Name", "Value": "no-arguments/Vpc/PrivateSubnet3" } - ] + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } } }, "VpcPrivateSubnet3RouteTableAssociation16BDDC43": { @@ -525,12 +525,12 @@ "VpcPrivateSubnet3DefaultRoute94B74F0D": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VpcPrivateSubnet3RouteTableD98824C7" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VpcPublicSubnet3NATGateway7640CD1D" + }, + "RouteTableId": { + "Ref": "VpcPrivateSubnet3RouteTableD98824C7" } } }, @@ -548,11 +548,11 @@ "VpcVPCGWBF912B6E": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "Vpc8378EB38" - }, "InternetGatewayId": { "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" } } }, @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc" + "Value": "no-arguments/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc" + "Value": "no-arguments/Vpc/FlowLog" } ] }, @@ -646,11 +646,6 @@ "VpcFlowLog8FF33A73": { "Type": "AWS::EC2::FlowLog", "Properties": { - "ResourceId": { - "Ref": "Vpc8378EB38" - }, - "ResourceType": "VPC", - "TrafficType": "ALL", "DeliverLogsPermissionArn": { "Fn::GetAtt": [ "VpcFlowLogIAMRole6A475D41", @@ -661,12 +656,17 @@ "LogGroupName": { "Ref": "VpcFlowLogLogGroup7B5C56B9" }, + "ResourceId": { + "Ref": "Vpc8378EB38" + }, + "ResourceType": "VPC", "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc" + "Value": "no-arguments/Vpc/FlowLog" } - ] + ], + "TrafficType": "ALL" } }, "newlbF396DAF2": { @@ -745,12 +745,6 @@ "DefaultAction": { "Allow": {} }, - "Scope": "REGIONAL", - "VisibilityConfig": { - "CloudWatchMetricsEnabled": true, - "MetricName": "webACL", - "SampledRequestsEnabled": true - }, "Rules": [ { "Name": "AWS-AWSManagedRulesBotControlRuleSet", @@ -878,7 +872,13 @@ "SampledRequestsEnabled": true } } - ] + ], + "Scope": "REGIONAL", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + } } }, "testwafwebaclalbWebACLAssociation": { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json index a8c3a785d..f2926a264 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json @@ -40,13 +40,13 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, + "Handler": ".handler", "Role": { "Fn::GetAtt": [ "testOneFunctionServiceRole3F9CD9E7", "Arn" ] }, - "Handler": ".handler", "Runtime": "nodejs16.x" }, "DependsOn": [ @@ -129,10 +129,10 @@ "testOneApiDeploymentEF63BD86e15daf42da17689cb6d56b07d074b512": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testOneApi71064556" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testOneApiproxyANY7F46A6A5", @@ -153,12 +153,12 @@ "testOneApiDeploymentStageprod5B67F2DF": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testOneApi71064556" - }, "DeploymentId": { "Ref": "testOneApiDeploymentEF63BD86e15daf42da17689cb6d56b07d074b512" }, + "RestApiId": { + "Ref": "testOneApi71064556" + }, "StageName": "prod" }, "DependsOn": [ @@ -275,14 +275,8 @@ "testOneApiproxyANY7F46A6A5": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "testOneApiproxyC9BD4274" - }, - "RestApiId": { - "Ref": "testOneApi71064556" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -309,6 +303,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "testOneApiproxyC9BD4274" + }, + "RestApiId": { + "Ref": "testOneApi71064556" } }, "Metadata": { @@ -403,17 +403,8 @@ "testOneApiANY899DD2DA": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "testOneApi71064556", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testOneApi71064556" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -440,6 +431,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "testOneApi71064556", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testOneApi71064556" } }, "Metadata": { @@ -493,13 +493,13 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, + "Handler": ".handler", "Role": { "Fn::GetAtt": [ "testTwoFunctionServiceRoleF678C905", "Arn" ] }, - "Handler": ".handler", "Runtime": "nodejs16.x" }, "DependsOn": [ @@ -582,10 +582,10 @@ "testTwoApiDeployment4EDBF4DF26b103f50979cda2b3c8314c6d694485": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testTwoApi17A08EF5" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testTwoApiproxyANY63FFF74A", @@ -606,12 +606,12 @@ "testTwoApiDeploymentStageprod8DB1EDB4": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testTwoApi17A08EF5" - }, "DeploymentId": { "Ref": "testTwoApiDeployment4EDBF4DF26b103f50979cda2b3c8314c6d694485" }, + "RestApiId": { + "Ref": "testTwoApi17A08EF5" + }, "StageName": "prod" }, "DependsOn": [ @@ -728,14 +728,8 @@ "testTwoApiproxyANY63FFF74A": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "testTwoApiproxy2575DCE3" - }, - "RestApiId": { - "Ref": "testTwoApi17A08EF5" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -762,6 +756,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "testTwoApiproxy2575DCE3" + }, + "RestApiId": { + "Ref": "testTwoApi17A08EF5" } }, "Metadata": { @@ -856,17 +856,8 @@ "testTwoApiANY91121C6F": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "testTwoApi17A08EF5", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testTwoApi17A08EF5" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -893,6 +884,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "testTwoApi17A08EF5", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testTwoApi17A08EF5" } }, "Metadata": { @@ -912,12 +912,6 @@ "DefaultAction": { "Allow": {} }, - "Scope": "REGIONAL", - "VisibilityConfig": { - "CloudWatchMetricsEnabled": true, - "MetricName": "webACL", - "SampledRequestsEnabled": true - }, "Rules": [ { "Name": "AWS-AWSManagedRulesBotControlRuleSet", @@ -1045,7 +1039,13 @@ "SampledRequestsEnabled": true } } - ] + ], + "Scope": "REGIONAL", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + } } }, "firstconstructWebACLAssociation": { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json index 0f7c7a7ec..7828ece80 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json @@ -40,13 +40,13 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, + "Handler": ".handler", "Role": { "Fn::GetAtt": [ "testFunctionServiceRoleFEC29B6F", "Arn" ] }, - "Handler": ".handler", "Runtime": "nodejs16.x" }, "DependsOn": [ @@ -129,10 +129,10 @@ "testApiDeployment3727A0B98616f677c89f00f84016798f65d107c0": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testApiD6ECAB50" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testApiproxyANYC53F2608", @@ -153,12 +153,12 @@ "testApiDeploymentStageprodCE051BE8": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testApiD6ECAB50" - }, "DeploymentId": { "Ref": "testApiDeployment3727A0B98616f677c89f00f84016798f65d107c0" }, + "RestApiId": { + "Ref": "testApiD6ECAB50" + }, "StageName": "prod" }, "DependsOn": [ @@ -275,14 +275,8 @@ "testApiproxyANYC53F2608": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "testApiproxyA0E5503A" - }, - "RestApiId": { - "Ref": "testApiD6ECAB50" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -309,6 +303,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "testApiproxyA0E5503A" + }, + "RestApiId": { + "Ref": "testApiD6ECAB50" } }, "Metadata": { @@ -403,17 +403,8 @@ "testApiANYDC600770": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "testApiD6ECAB50", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testApiD6ECAB50" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -440,6 +431,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "testApiD6ECAB50", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testApiD6ECAB50" } }, "Metadata": { @@ -459,12 +459,6 @@ "DefaultAction": { "Allow": {} }, - "Scope": "REGIONAL", - "VisibilityConfig": { - "CloudWatchMetricsEnabled": true, - "MetricName": "webACL", - "SampledRequestsEnabled": true - }, "Rules": [ { "Name": "AWS-AWSManagedRulesBotControlRuleSet", @@ -592,7 +586,13 @@ "SampledRequestsEnabled": true } } - ] + ], + "Scope": "REGIONAL", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + } } }, "testwafwebaclapigatewaylambdaWebACLAssociation": { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json index b48ef6055..2bb675390 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json @@ -40,13 +40,13 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, + "Handler": ".handler", "Role": { "Fn::GetAtt": [ "testFunctionServiceRoleFEC29B6F", "Arn" ] }, - "Handler": ".handler", "Runtime": "nodejs16.x" }, "DependsOn": [ @@ -129,10 +129,10 @@ "testApiDeployment3727A0B98616f677c89f00f84016798f65d107c0": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testApiD6ECAB50" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testApiproxyANYC53F2608", @@ -153,12 +153,12 @@ "testApiDeploymentStageprodCE051BE8": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testApiD6ECAB50" - }, "DeploymentId": { "Ref": "testApiDeployment3727A0B98616f677c89f00f84016798f65d107c0" }, + "RestApiId": { + "Ref": "testApiD6ECAB50" + }, "StageName": "prod" }, "DependsOn": [ @@ -275,14 +275,8 @@ "testApiproxyANYC53F2608": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "testApiproxyA0E5503A" - }, - "RestApiId": { - "Ref": "testApiD6ECAB50" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -309,6 +303,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "testApiproxyA0E5503A" + }, + "RestApiId": { + "Ref": "testApiD6ECAB50" } }, "Metadata": { @@ -403,17 +403,8 @@ "testApiANYDC600770": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "testApiD6ECAB50", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testApiD6ECAB50" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -440,6 +431,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "testApiD6ECAB50", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testApiD6ECAB50" } }, "Metadata": { @@ -459,12 +459,6 @@ "DefaultAction": { "Allow": {} }, - "Scope": "REGIONAL", - "VisibilityConfig": { - "CloudWatchMetricsEnabled": true, - "MetricName": "webACL", - "SampledRequestsEnabled": true - }, "Name": "test-name-apigateway", "Rules": [ { @@ -593,7 +587,13 @@ "SampledRequestsEnabled": true } } - ] + ], + "Scope": "REGIONAL", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + } } }, "testwafwebaclapigatewaylambdaWebACLAssociation": { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.no-arguments.expected.json index d8a6edb1b..7e29e1c88 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.no-arguments.expected.json @@ -13,12 +13,6 @@ "DefaultAction": { "Allow": {} }, - "Scope": "REGIONAL", - "VisibilityConfig": { - "CloudWatchMetricsEnabled": true, - "MetricName": "webACL", - "SampledRequestsEnabled": true - }, "Rules": [ { "Name": "AWS-AWSManagedRulesBotControlRuleSet", @@ -146,7 +140,13 @@ "SampledRequestsEnabled": true } } - ] + ], + "Scope": "REGIONAL", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + } } }, "testwafwebaclappsyncWebACLAssociation": { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json index c7f333c0c..8a2b6cbf4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json @@ -13,12 +13,6 @@ "DefaultAction": { "Allow": {} }, - "Scope": "REGIONAL", - "VisibilityConfig": { - "CloudWatchMetricsEnabled": true, - "MetricName": "webACL", - "SampledRequestsEnabled": true - }, "Name": "test-name-appsync", "Rules": [ { @@ -147,7 +141,13 @@ "SampledRequestsEnabled": true } } - ] + ], + "Scope": "REGIONAL", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + } } }, "testwafwebaclappsyncWebACLAssociation": { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.existing-waf-to-multiple-cloudfront.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.existing-waf-to-multiple-cloudfront.expected.json index 5b1394173..1dd044136 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.existing-waf-to-multiple-cloudfront.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.existing-waf-to-multiple-cloudfront.expected.json @@ -176,12 +176,6 @@ "DefaultAction": { "Allow": {} }, - "Scope": "CLOUDFRONT", - "VisibilityConfig": { - "CloudWatchMetricsEnabled": true, - "MetricName": "webACL", - "SampledRequestsEnabled": true - }, "Rules": [ { "Name": "AWS-AWSManagedRulesBotControlRuleSet", @@ -309,7 +303,13 @@ "SampledRequestsEnabled": true } } - ] + ], + "Scope": "CLOUDFRONT", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + } } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.no-arguments.expected.json index f50031c7d..65721a0dd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.no-arguments.expected.json @@ -91,12 +91,6 @@ "DefaultAction": { "Allow": {} }, - "Scope": "CLOUDFRONT", - "VisibilityConfig": { - "CloudWatchMetricsEnabled": true, - "MetricName": "webACL", - "SampledRequestsEnabled": true - }, "Rules": [ { "Name": "AWS-AWSManagedRulesBotControlRuleSet", @@ -224,7 +218,13 @@ "SampledRequestsEnabled": true } } - ] + ], + "Scope": "CLOUDFRONT", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + } } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json index d90fd31af..dce1c2672 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json @@ -91,12 +91,6 @@ "DefaultAction": { "Allow": {} }, - "Scope": "CLOUDFRONT", - "VisibilityConfig": { - "CloudWatchMetricsEnabled": true, - "MetricName": "webACL", - "SampledRequestsEnabled": true - }, "Name": "test-name-cloudfront", "Rules": [ { @@ -225,7 +219,13 @@ "SampledRequestsEnabled": true } } - ] + ], + "Scope": "CLOUDFRONT", + "VisibilityConfig": { + "CloudWatchMetricsEnabled": true, + "MetricName": "webACL", + "SampledRequestsEnabled": true + } } } }, diff --git a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.expected.json b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.expected.json index 2d452a073..7e40d2de2 100644 --- a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.expected.json +++ b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-asset.expected.json @@ -211,13 +211,13 @@ }, "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" }, + "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "TestTemplateWriterLambdaRole192FE23A", "Arn" ] }, - "Handler": "index.handler", "Runtime": "nodejs18.x", "TracingConfig": { "Mode": "Active" @@ -326,13 +326,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" - }, - "Role": { - "Fn::GetAtt": [ - "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A", - "Arn" - ] + "S3Key": "7382a0addb9f34974a1ea6c6c9b063882af874828f366f5c93b2b7b64db15c94.zip" }, "Description": "AWS CDK resource provider framework - onEvent (template-writer-from-asset/TestTemplateWriterProvider)", "Environment": { @@ -346,7 +340,13 @@ } }, "Handler": "framework.onEvent", - "Runtime": "nodejs14.x", + "Role": { + "Fn::GetAtt": [ + "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A", + "Arn" + ] + }, + "Runtime": "nodejs18.x", "Timeout": 900 }, "DependsOn": [ diff --git a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.expected.json b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.expected.json index 706be9649..e7903d42f 100644 --- a/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.expected.json +++ b/source/patterns/@aws-solutions-constructs/resources/test/integ.template-writer-from-large-asset.expected.json @@ -211,14 +211,14 @@ }, "S3Key": "96f7d2d4f45b57a586d030966d31e06bc622b5f20258ca38d605fef38e6b9a17.zip" }, + "Handler": "index.handler", + "MemorySize": 1024, "Role": { "Fn::GetAtt": [ "TestTemplateWriterLambdaRole192FE23A", "Arn" ] }, - "Handler": "index.handler", - "MemorySize": 1024, "Runtime": "nodejs18.x", "Timeout": 60, "TracingConfig": { @@ -328,13 +328,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "8e3d635893ea17fa3158623489cd42c680fad925b38de1ef51cb10d84f6e245e.zip" - }, - "Role": { - "Fn::GetAtt": [ - "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A", - "Arn" - ] + "S3Key": "7382a0addb9f34974a1ea6c6c9b063882af874828f366f5c93b2b7b64db15c94.zip" }, "Description": "AWS CDK resource provider framework - onEvent (template-writer-from-large-asset/TestTemplateWriterProvider)", "Environment": { @@ -348,7 +342,13 @@ } }, "Handler": "framework.onEvent", - "Runtime": "nodejs14.x", + "Role": { + "Fn::GetAtt": [ + "TestTemplateWriterProviderframeworkonEventServiceRoleED11CF9A", + "Arn" + ] + }, + "Runtime": "nodejs18.x", "Timeout": 900 }, "DependsOn": [ diff --git a/source/tools/cdk-integ-tools/package.json b/source/tools/cdk-integ-tools/package.json index 25e932120..bbaf5dc05 100644 --- a/source/tools/cdk-integ-tools/package.json +++ b/source/tools/cdk-integ-tools/package.json @@ -32,12 +32,12 @@ "@types/node": "18.11.9", "tslint": "^5.20.1", "typescript": "~3.9.10", - "aws-cdk-lib": "2.81.0", + "aws-cdk-lib": "2.99.1", "constructs": "^10.0.0" }, "dependencies": { - "@aws-cdk/cloudformation-diff": "2.81.0", - "aws-cdk": "2.81.0", + "@aws-cdk/cloudformation-diff": "2.99.1", + "aws-cdk": "2.99.1", "fs-extra": "^9.0.1", "yargs": "^16.1.1", "deepmerge": "^4.0.0" From f307ce2b1f0a65f2f8e3d61a90ca2c2f8d632902 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Sat, 14 Oct 2023 13:51:52 +0000 Subject: [PATCH 57/73] chore(release): 2.45.0 --- CHANGELOG.md | 7 +++++++ source/lerna.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 603c7e088..4225cd732 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.45.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.44.0...v2.45.0) (2023-10-14) + + +### Bug Fixes + +* **all:** typos ([#1010](https://github.com/awslabs/aws-solutions-constructs/issues/1010)) ([0787baf](https://github.com/awslabs/aws-solutions-constructs/commit/0787baf7c68f84599139e5b886d5942b076174f2)) + ## [2.44.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.43.0...v2.44.0) (2023-08-29) Built on CDK v2.82.0 (no new features, just internal housekeeping) diff --git a/source/lerna.json b/source/lerna.json index d345e11d4..189481e63 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.44.0" + "version": "2.45.0" } From 0ad9a275ad98a96740db415ce1ecb2f6d9d9f6cf Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sat, 14 Oct 2023 09:55:12 -0400 Subject: [PATCH 58/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4225cd732..09cecc0a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. See [standa ## [2.45.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.44.0...v2.45.0) (2023-10-14) +Built on CDK v2.99.1 +Significant internal clean up chores ### Bug Fixes From 477d26b3f60d901fe71dd88fccd587c69d264ee9 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Fri, 3 Nov 2023 16:01:33 -0400 Subject: [PATCH 59/73] Remove aws-kinesisfirehose-s3-and-kinesisanalytics (#1023) --- sonar-project.properties | 1 - .../.eslintignore | 5 - .../.gitignore | 15 - .../.npmignore | 21 - .../README.md | 205 ------- .../architecture.png | Bin 120293 -> 0 bytes .../lib/index.ts | 127 ----- .../package.json | 106 ---- .../integ.customLoggingBucket.expected.json | 535 ------------------ .../test/integ.customLoggingBucket.ts | 65 --- .../test/integ.no-arguments.expected.json | 534 ----------------- .../test/integ.no-arguments.ts | 61 -- .../test/integ.noLoggingBucket.expected.json | 421 -------------- .../test/integ.noLoggingBucket.ts | 68 --- ...isfirehose-s3-and-kinesisanalytics.test.ts | 215 ------- .../test/lambda/index.js | 8 - 16 files changed, 2387 deletions(-) delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.eslintignore delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.gitignore delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.npmignore delete mode 100755 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/README.md delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/architecture.png delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.expected.json delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts delete mode 100644 source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/lambda/index.js diff --git a/sonar-project.properties b/sonar-project.properties index f6b2fc410..1527677dd 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -60,7 +60,6 @@ sonar.javascript.lcov.reportPaths= \ source/patterns/@aws-solutions-constructs/aws-iot-lambda/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-iot-s3/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-iot-sqs/coverage/lcov.info, \ - source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/coverage/lcov.info, \ source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/coverage/lcov.info, \ diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.eslintignore b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.eslintignore deleted file mode 100644 index 0819e2e65..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -lib/*.js -test/*.js -*.d.ts -coverage -test/lambda/index.js \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.gitignore b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.gitignore deleted file mode 100644 index 6773cabd2..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -lib/*.js -test/*.js -*.js.map -*.d.ts -node_modules -*.generated.ts -dist -.jsii - -.LAST_BUILD -.nyc_output -coverage -.nycrc -.LAST_PACKAGE -*.snk \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.npmignore b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.npmignore deleted file mode 100644 index f66791629..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/.npmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Exclude typescript source and config -*.ts -tsconfig.json -coverage -.nyc_output -*.tgz -*.snk -*.tsbuildinfo - -# Include javascript files and typescript declarations -!*.js -!*.d.ts - -# Exclude jsii outdir -dist - -# Include .jsii -!.jsii - -# Include .jsii -!.jsii \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/README.md b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/README.md deleted file mode 100755 index ffce80da8..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/README.md +++ /dev/null @@ -1,205 +0,0 @@ -# aws-kinesisfirehose-s3-and-kinesisanalytics module - - ---- - -![Stability: Experimental](https://img.shields.io/badge/stability-Experimental-important.svg?style=for-the-badge) - -> All classes are under active development and subject to non-backward compatible changes or removal in any -> future version. These are not subject to the [Semantic Versioning](https://semver.org/) model. -> This means that while you may use them, you may need to update your source code when upgrading to a newer version of this package. - ---- - - -| **Reference Documentation**:| https://docs.aws.amazon.com/solutions/latest/constructs/| -|:-------------|:-------------| -
- -| **Language** | **Package** | -|:-------------|-----------------| -|![Python Logo](https://docs.aws.amazon.com/cdk/api/latest/img/python32.png) Python|`aws_solutions_constructs.aws_kinesisfirehose_s3_and_kinesisanalytics`| -|![Typescript Logo](https://docs.aws.amazon.com/cdk/api/latest/img/typescript32.png) Typescript|`@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics`| -|![Java Logo](https://docs.aws.amazon.com/cdk/api/latest/img/java32.png) Java|`software.amazon.awsconstructs.services.kinesisfirehoses3kinesisanalytics`| - -## Overview -This AWS Solutions Construct implements an Amazon Kinesis Firehose delivery stream connected to an Amazon S3 bucket, and an Amazon Kinesis Analytics application. - -Here is a minimal deployable pattern definition: - -Typescript -``` typescript -import { Construct } from 'constructs'; -import { Stack, StackProps } from 'aws-cdk-lib'; -import { KinesisFirehoseToAnalyticsAndS3 } from '@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics'; - -new KinesisFirehoseToAnalyticsAndS3(this, 'FirehoseToS3AndAnalyticsPattern', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ticker_symbol', - sqlType: 'VARCHAR(4)', - mapping: '$.ticker_symbol' - }, { - name: 'sector', - sqlType: 'VARCHAR(16)', - mapping: '$.sector' - }, { - name: 'change', - sqlType: 'REAL', - mapping: '$.change' - }, { - name: 'price', - sqlType: 'REAL', - mapping: '$.price' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - } -}); -``` - -Python -```python -from aws_solutions_constructs.aws_kinesis_firehose_s3_kinesis_analytics import KinesisFirehoseToAnalyticsAndS3 -from aws_cdk import ( - aws_kinesisanalytics as kinesisanalytics, - Stack -) -from constructs import Construct - -KinesisFirehoseToAnalyticsAndS3(self, 'FirehoseToS3AndAnalyticsPattern', - kinesis_analytics_props=kinesisanalytics.CfnApplicationProps( - inputs=[kinesisanalytics.CfnApplication.InputProperty( - input_schema=kinesisanalytics.CfnApplication.InputSchemaProperty( - record_columns=[kinesisanalytics.CfnApplication.RecordColumnProperty( - name='ticker_symbol', - sql_type='VARCHAR(4)', - mapping='$.ticker_symbol' - ), kinesisanalytics.CfnApplication.RecordColumnProperty( - name='sector', - sql_type='VARCHAR(16)', - mapping='$.sector' - ), kinesisanalytics.CfnApplication.RecordColumnProperty( - name='change', - sql_type='REAL', - mapping='$.change' - ), kinesisanalytics.CfnApplication.RecordColumnProperty( - name='price', - sql_type='REAL', - mapping='$.price' - )], - record_format=kinesisanalytics.CfnApplication.RecordFormatProperty( - record_format_type='JSON' - ), - record_encoding='UTF-8' - ), - name_prefix='SOURCE_SQL_STREAM' - )] - ) - ) -``` - -Java -``` java -import software.constructs.Construct; -import java.util.List; - -import software.amazon.awscdk.Stack; -import software.amazon.awscdk.StackProps; -import software.amazon.awscdk.services.kinesisanalytics.*; -import software.amazon.awscdk.services.kinesisanalytics.CfnApplication.*; -import software.amazon.awsconstructs.services.kinesisfirehoses3kinesisanalytics.*; - -new KinesisFirehoseToAnalyticsAndS3(this, "FirehoseToS3AndAnalyticsPattern", - new KinesisFirehoseToAnalyticsAndS3Props.Builder() - .kinesisAnalyticsProps(new CfnApplicationProps.Builder() - .inputs(List.of(new InputProperty.Builder() - .inputSchema(new InputSchemaProperty.Builder() - .recordColumns(List.of( - new RecordColumnProperty.Builder() - .name("ticker_symbol") - .sqlType("VARCHAR(4)") - .mapping("$.ticker_symbol") - .build(), - new RecordColumnProperty.Builder() - .name("sector") - .sqlType("VARCHAR(16)") - .mapping("$.sector") - .build(), - new RecordColumnProperty.Builder() - .name("change") - .sqlType("REAL") - .mapping("$.change") - .build(), - new RecordColumnProperty.Builder() - .name("price") - .sqlType("REAL") - .mapping("$.price") - .build())) - .recordFormat(new RecordFormatProperty.Builder() - .recordFormatType("JSON") - .build()) - .recordEncoding("UTF-8") - .build()) - .namePrefix("SOURCE_SQL_STREAM") - .build())) - .build()) - .build()); -``` - -## Pattern Construct Props - -| **Name** | **Type** | **Description** | -|:-------------|:----------------|-----------------| -|kinesisFirehoseProps?|[`kinesisFirehose.CfnDeliveryStreamProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesisfirehose.CfnDeliveryStreamProps.html)|Optional user-provided props to override the default props for the Kinesis Firehose delivery stream.| -|kinesisAnalyticsProps?|[`kinesisAnalytics.CfnApplicationProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesisanalytics.CfnApplicationProps.html)|Optional user-provided props to override the default props for the Kinesis Analytics application.| -|existingBucketObj?|[`s3.IBucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.IBucket.html)|Existing instance of S3 Bucket object. If this is provided, then also providing bucketProps is an error. | -|bucketProps?|[`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html)|User provided props to override the default props for the S3 Bucket.| -|logGroupProps?|[`logs.LogGroupProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_logs.LogGroupProps.html)|User provided props to override the default props for for the CloudWatchLogs LogGroup.| -|loggingBucketProps?|[`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html)|Optional user provided props to override the default props for the S3 Logging Bucket.| -|logS3AccessLogs?| boolean|Whether to turn on Access Logging for the S3 bucket. Creates an S3 bucket with associated storage costs for the logs. Enabling Access Logging is a best practice. default - true| - -## Pattern Properties - -| **Name** | **Type** | **Description** | -|:-------------|:----------------|-----------------| -|kinesisAnalytics|[`kinesisAnalytics.CfnApplication`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesisanalytics.CfnApplication.html)|Returns an instance of the Kinesis Analytics application created by the pattern.| -|kinesisFirehose|[`kinesisFirehose.CfnDeliveryStream`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_kinesisfirehose.CfnDeliveryStream.html)|Returns an instance of the Kinesis Firehose delivery stream created by the pattern.| -|kinesisFirehoseRole|[`iam.Role`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.Role.html)|Returns an instance of the iam.Role created by the construct for Kinesis Data Firehose delivery stream.| -|kinesisFirehoseLogGroup|[`logs.LogGroup`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_logs.LogGroup.html)|Returns an instance of the LogGroup created by the construct for Kinesis Data Firehose delivery stream| -|s3Bucket?|[`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html)|Returns an instance of the S3 bucket created by the pattern.| -|s3LoggingBucket?|[`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html)|Returns an instance of s3.Bucket created by the construct as the logging bucket for the primary bucket.| -|s3BucketInterface|[`s3.IBucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.IBucket.html)|Returns an instance of s3.IBucket created by the construct.| - -## Default settings - -Out of the box implementation of the Construct without any override will set the following defaults: - -### Amazon Kinesis Firehose -* Enable CloudWatch logging for Kinesis Firehose -* Configure least privilege access IAM role for Amazon Kinesis Firehose - -### Amazon S3 Bucket -* Configure Access logging for S3 Bucket -* Enable server-side encryption for S3 Bucket using AWS managed KMS Key -* Enforce encryption of data in transit -* Turn on the versioning for S3 Bucket -* Don't allow public access for S3 Bucket -* Retain the S3 Bucket when deleting the CloudFormation stack -* Applies Lifecycle rule to move noncurrent object versions to Glacier storage after 90 days - -### Amazon Kinesis Data Analytics -* Configure least privilege access IAM role for Amazon Kinesis Analytics - -## Architecture -![Architecture Diagram](architecture.png) - -*** -© Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/architecture.png b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/architecture.png deleted file mode 100644 index 9f9e472d87360ba4a06b8496c403448a98b61774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120293 zcmaI8c{tSV-#%V$_Z>+^p%PM22ua8~l_Y!i-Gq>3j3vWhOp7I3l093IeHrVFU9!d4 zw_yg8ZLDJ&!wfTqpZod!e#h~AzaP)@hl6n(j^lm3uj}Z+;shV}zh5U^ zvPX{o+;Mk3z`QM<;>lFnOqir6LT->-J94CY$GEzx8FUuA(ZnE z&yumVMkjj&Z<5Zn50WbdET{E{Slpst-DSB>xq1EOLvAB2k)nE|_Njtwylg3L=2lWF z_7-Lwh-twTQCi$p*V85hc9;FjVARKs4^Ob1e{+KM+KH2F|Lwo-V2Oj2BdqWqGYv-8SW}>Ie4#9DH^4%sGai~3CPsxB7b02?Jxdg z9rVRXCR236zQ6lpE;K+2YbiRRDKCp9`JqMC$r88~R-J`6)_cr|(CV3IMu&Q$pt&s& zoboPi+ecSF?MH+0$7{zvSRdEhq@FEVGc#-+2ZvHkj}aAF8y6O=!)f#BeWV?ldIJ*~ z^Tm}*R?0tyWGWPzq;hiNx#vUNsHA&&!*v8qyZ5Qj1Axf0t)YsB!80 z`OZYKgwMMF=crDZh9|zNz5!!lF_0FRSga^`y7EM)_%y}p`$R~Ha_WYh=t9`(Rde+_ zbh{38U1i8`hQwzoWz=B@#aEj*J=%y=<{`~d!%{VrB}LBy56Z`RxYK-*McR?Rn4@U zntN_)NgyOJ<)Q)=GmXh5=mhg)Oq$N^(dvB+Fy@>Brgp`^jO$M{@|gwm)e$SzQ89S! z(!O}}y@L4})1CG~f$ljq+Sf%P-x-sarLia8&0}}DIRB5`|F47aP)P4bGe-*EqjiuPHdvt{C4p{`GH$DT+(qXy7i9ve-3xwk8C+i3!Y@{#O1aN{@=&+-v_aQqyZIY(l!jhm4Ue12oh_=emQ5pH+SCVyCz8PMg6uVD$hgqX z*9^}=x@9rV(4nXsmy0MVP-)G6O38Z2m1{Js`5{|1f=HtarjrT$sv4>^vIn<==Bdy9 z@Y^X2yYNrRg*ILNLvz;iT`on^Buny6Wkp4OrZWA{180n zmus-}CE&5?1VWW^;$Fn$s|yU8P%uKbww(cCyLNl_>{aCdRr>$6`ES^seO=4>DrUmG zp1tlN1Jho|6|yQV)=K1vwsw#vn!#w4Z| z@*UV;@?gRgdYm3sC>h^1h2;)vdLXedP{BmucXrUOVmDR&zAD`G*>0Hg}&R3fk~}{#5p3) zH`pxiOYz*mWpIn3^j2Wg7WC8Jcktdt1E{-H&|q0D>f(;v;GeecznoB+*u+>F*`w-7 z8|Gp=rp8syr;cSmy()74gg=Ltm0dIX$}}(9#XilbFf{ejyp-K za&LWUEaP&MZfGO0voQ|S7mzJ+Gpt)MyKR-9JvZ5Bx18_eJ<6gZt`p%w`?Cz5HdQ^4mwl>KnLj_uO&E znmo2YlQLohj7}@9EXWvdT}GUTZtrdF5_`HQ5RpT58S&no|YU*yGFB!@Ai zDNv{43PH(V>(zVJ`-o4Ci^_fyL$9SY>e%FaB>;mG_PXqDi@_eg_-W}zTmu4R1@(K* zC>9scmwFFMjaw+$e$e7DmNr=3sif6u5E)}9eN{Dojj^f;kxpI4Oe1Y%ORX0C`};L7 zC!*-vSCAu@okrQxgO~a(B#ySYmiwmQe`5LD(e#HQi}f894@$L6i_DTN{M^}YkbCou zL-Jl*4o%MXkA90+3j1lNIgo^6S(khy*(sZMn#((}=2lucAoY|zB4=#b>pgkG0e_yq z+756bAXw2ddwgwoAA6R|aM)CllK1L?_T0e2F84Lr>rpXl=66W7Tox##SB~)iNh$tc zP+8S`80ZiQRB~mvXb4-*Nhz_I;|hW*59rSLe}C;~?IZ`_ThqPkOGF3D@#7jk6*OPu zU0>*2D*dH|(g^QT3xL5z3`ux{( zo?s<}K8$n>nI7rB`8w^h>Gc`nw@=6=o=CPC3Mcxv%_rLH^5N%v;t@+4|QN}G_= zjmd8w4_tj6l`<(W7&0rSK0%xOL*!a`pI6!KF2K1>F}InI_Jx*VhaW%6wMX|VZq^RS zZ^a~(u4z@au`7D?xg{&Ix_oV&Kj`jf&?#Z@%06l|qOj zp@<`b?{J^Q-fgTFTfpvHv}IjGN)$AAlQ%DXd_Uw2{m$9-=Vn%ek#1+Y@pj>sw&#u$ zdPRHj)k}2NA`a$}56#5W=+3&uknfTcrng{$@qe~l1Ye5JdL(Se5{1>AgBPJsyz<51 z>fWLrtjDzy16J*89FN3nRsZ^ZJ-yksZlpa?lHEn*{zQvKSY4i02byq_YBPkF?OPNi zSu5%UwHReYKko^W%7+F7guYPdOVZB8prEe492{KIJqRkAyIEo|(WbzJ3-KlSS>x80 zY-5S)9ZQWQgG@xXdk)=akUoq_%{DR>{W~T+Ew>?fs|ky|S!w3!G$7dSl=x<~l(p{L z0|~|XV?a3d97}>0=I70-`WNQ6{6!@HmS45I#Zz|EOXE#9PV=2?Y1M1{QvQaAqT_e= zlMY_)==>TDiCwKPEB)G`q~+c#bB5jXN>xPdY^5v_xYNCy!A(&yUL+TYtdE-j*TsLI zHS6r`E(B(TpBX(cCijeqv=?RY2t=5{mXe||gm(@nzwE_+eITpEa!ehk>aa-Z=M9O} z_VScmMAPx-YM9u&J7wEae0>+Q0rTcTj+MIbh`S?Ss)IKaoLkP=>q2l|@ppJ+v(cUM z_fsbGv$KBe>-pFUFdwT;X>Wpd!3dkZ z6rsFStLZdTJjV97(GQD_-b?IGBTa6KU+T5U2N!bEs(vY;X@y&oWRE5;m<#btqNE$v zSKQKSL5_RnacMfWR(!P}uy=LG_y z!CA7ek_&aI@(7>N)6aF+s$0)rbaBzVd0b&X{NZ<}$ecTWqiF=O4PjU;jZDY-)M|;_ z&CM65L_4I3->U=a8Lw{LS8pO(6*s*tfYzZ)AH#@pP9p{vi39CrPkcY*-d194-&ZrY z2>l4Y)up0OvL|~1gBG9n+hGXa4!A_L*UD_d&%l8`xn6?HrrLnfp40FLErd&QBz{dd zqD=?6wn*5W zMH0dt+R~Uu$5L7O`fvhH@EOgd*2<@ z%zereq^> zPhOsOZ&#Iml`a&5K(4+`soC+zjZYAab^E3Z(t&hFx3h0RNmN zns?lN$He7N0N#dbqvCw)&Hwm@`B+3v>OZ->ON_RW3e5`?(dgUYt_WVVi?pvVW6iq3 zDy8Mf-8C;+bcgk>(`|bh_lCSJYqLlP%l2{Ebm`5>5hT1l7fUTr$ti0^D{A|URMyzr zT4O6~L3Io$Xx&k0MGdVWzW6xU}#3?ul$?xi4#J}&z04>cF@lJS)((u1=o3#uZJ)9 z9T7N}r<&J}D?|0KucehM&=y9h$EMZhA8e&S_1GnSqppUpa$Z+Btds702ujcOCCN(v zCJR3l&xGDCV6J2%Qh2c+!SpT2gl|iOBnW>mQ88?4B+aFUI2iC6N8Ofok2oZ}ClXSc z^CW@(2~NN4a!OrdZUnve_H;+m6WZ_6Hgn7e7v~PxgoiU>c-0$D89m6y;wCV_%K1`C zqt;2}kgT1ebcnq_9*gi_2+wJ^`d=nZHMTl7(Yd>S-)A@d-2C0JbL{3_9I%2Dh{n+R z+YdOsMSe_`E1q?*fTkO=t2|{CdwmX|Si(sh*uSMioN-<#%CyV=13D=ijB2786DMyW zK)2N3zUfyV%y%Y3JVEQyN+o5j>-C_~8=H=mje(Ot=N)kL4r#aa*7=hlk`vhVlpW(N zNnN0HvvmO2wg8*D$-Q>z%B|QG)z5Y602p?EI_<|o!qW5Z3jv-Ymo{>Xq#;kE%CV&wpQWi3}Co zqu=lN;UJ?g^C8CG){^Zc#+=tWP2Ua>5ZkGa07(4^c4i4iQ~FleLXV+Gf@~|+@4D50 zn(S-qO4!~Bt>i}SgNoCiR91;a;HS|6tMBLdlmnB&O`3{2skezen)isE&4}F+$PQ-Trg2r_uu9KUF<(B| zW6yx*zI-@9s|}M?e|3k;u#yK@=r*Cy|V{}x8t-s8DpXLPz&2z9mE%;4^# z39(qnr9XHU7F9&}-Q1vePUn7bBm{L&QSNAy3c5JJ$8qJvH_piYk} zxCznA538|g>`%}3krO5d;0_O)n{62}d?@SfvO&e|*x}{Ytr6r4Al+ygq59}jbj$+o z&DJo~eXKOFIL;?X0=v=sLL+8=DN!xTJX7iMJbz{_B+=+mJ616+@QS#MvgyA|&^`k{ zZV4aXa9HNstrD@xY_Ft-d&5eGntt9HmYCQYe{Rz1%@_VlPV8J>5wuCO2nJ@rLtZIk z)S_$_CX*U*E-hqp+&2le&HN~YfAVS&*`K}S=~x27y41cu4(@5d*!KrcoMrYiN@CzQ zw#$KVGwaDZyHl0IXLEOTE&bMKE=<0x?Z*^17q@I7E?!tFo6hn$f6B3BH^SqR+z3IA zN02=j%trJ0U;8o#%eN<5iB~qe!X``=h(3M)s+{;VUoO3JT`P$BXRe<2XbarGY2G=m2|s*s(>&}k&*|he5zjqOafdIM zvIn?rRZvpuM0@)%%yIAxcB5s^a!-1ngdgTbdHPJC8RybdcefzHw3brDHC*pvR1xlj zo$^Rvsi5Ukq6ScYRTZtU0H!Aaz!9?tbAqV;mL@0kg3!kLhw=LkwekXYsa2Ors_uo& z3(Dn7bk*Ox^X_KH@+2_?4#B1Ak)j zdI-Ii+9{#1lYza&@or{VqyAe98axplxZ-r*5aF}_R#Bmqf5SQ}4n}Wi@tufM$&>V$ znZ&$1U!SPZx3ft*jeddiJ1}IC0A9Wq(&Sp1WhS*|xNfM1$X?zcJWH|cI*<`Mq+LyM z2HX_Tpmo7S0xPdr~TE=u<=+-Tig<3BCPiCZBjKmTmm z8M9#O?!6FRByB%M102>11mhy^SS}{M!mJnM5bC%6*(B|J6@THJFDLCZ8|?7x?0mGz zO|{mqQ3dQ^A#Eg8gk&kuO~(b~uH3pDNz4Z_I0g%(-KVxp&$*_zE^=T;pvq-)Ve(Ve ztutFK61aF2yijk8H?KG*Vt~{fWNZmwT-3#5vgnvgLJt|9&l;Qe`>N{kw`Uu#{!EIh zg#3H7T%P@NOm*w~9!)V{SP3kt0u!^s6P+sC<=8Wqqz3Z-ERlIP1PP`7A703uI|;g( zC>AC%dGKA@b$t*pdO`oAAUG(5B7Lf|zv>Am9@+gG1~LO0?~GRG>=PsJ*oi$=_trez zSwoV}9kvkn2fFtLE&~rgKz{qBpk%Y?zmPzwa z(vy)se?H{dCBaQf1_1gOTsSPgl+^zgLVmr>rQ|xoxii!!Sp5lNz3X8jdmTFP_)VP3 z;N#d!$1IKz@doyEqEkKL`{VCbx#{^LT)F@`Gc(c3Ue#5XE1SY1eas{Y4^LX?YC%2! zlG_E}Y5RHG*k-DTSoe;|o%rH+->ab+Ym7hlxe&EFuDlnS5ZZQ9AForhGj+iix=1*{ zGaB<-X9_D{;i+l-l?ni`5QR<35)xrWbHn7{ESwlJe4Fxe(2WV<;gZMSy@jV81 zL)sU^IWdsQNOSJ(;%HB`t=Mi#9BNP|a&aZbZ zK1iYE-;UD)hUN9!wG^Oe-~FVv%@9}%HLvePc>fZXEYp${Fi%mag|#w}$mLtWQO{j6 z;1$D;iJ~e9g709En>p3EdTAKM+C@RK*ho7i&eCLT?Fl0)*lO2ARW&(#U3MxV!SUIq8UjQr{o3Gx&HpbPZ9{ z+{#o?g{)2s5KH-B(b-Pl8>!e?V-{29nwIS@mS12B-S#K|Yv-<{_8^RLTkUbcz_TN@ z=c!ldaZ(C^Rog})Ne@q*2IZS+6>qi9-C7dok>w+Ft)(Hara{xs6MTbicVHUcE|+*s zZw*O%fmP2kM_cKf9nY4zVA8K2NP9p{)Ji&@ZYRwy(C_UjT`4pTbT)uF@i9DAhRz-` zH5-`d zUEU8yr$yRt8NlPDlUlhD z9lAI@SPE5i1Y zv$YTxoU!K zd>i4WQT*+o4Rh#-+x`=Tl%$GCUct2xD~Utt2YDFt*fVhGJdG`D2QSqIIpKDv_P@QRFL)8?05_TQ-X$6VE!f znz<=P9VM^Kv5TI-U?coyX>)FN9kTKE{Vj3VC}?2)Z(in7PV2?#FkRo*vyG@lvMM9kQpPG~dF}drIfINA zs$%2B;Q4Xk4#XpuXD>{ZfDOw{4qG{{uXCC>vMY1i^anUKW6UKDG!!b|Pdga{7lp0AO<4-;~MBiUR1piAi z`-31oZq)S_Oa(ju^Xy zV_4PQ0@m+VT0f&uHORjiYlNZc$1l$q_Ny4#_zDeIRaDgvC2LQ_T=wn=EJLNF_O zkv`kAGxx`YXltEI;HLnTg8AhDMA*^Ev0CBcIHnRa&OdAGe^PdS$>@$meDRn<0ar`; z%e>zrB<`Kl79T(yAj)5xSSe^{9*DUTZL#RP-8)14fm56Gr01eRNs1!H&=)Ud#QJaL zadstpD6a1`|23Gf_NBYN?zTB+5Q9@2;P~Mkm#2Zm@9TD%fa^9FxBv9oLw0H$;FMus z7iLoKt)nq9z#F$;$oQ}M1GlxpsP*H^%(S$^1spaaZCjbm#2@ZbUbk!T&>8)^+4Lr9iv8N{fq{?DjstglSNyq0V4-*?lrze~I|T>s(@ z%;k9f1=p`C=EFTGZ&OubyEQ`EbeLaEb|hl68MzQjc60Tz`Mq%(4w8npgW38b<~V}3 z!<~jMu?H)?g>~yLRi}|kv}YjO=T&d^TEbkD*9WFH6*w^XrK{P}M_fPQMmKgV_7s+U z)N4_}yTwSK-Bg!#vivGkIpvjp?Z=Qm#mHs#Y*+r4Kl2bOM{8wSYxkaD!ybAQGqBeQ zc2zj|MY4VuNhu8(k9%6iu*oRJKhVqQ6+mb4&knwvLIw2cAMq0iQ>KBV07kSBIT6F{$r%%BdPl^GiNX`~9_ zq$hrVi3WC2p;QuolbE&->iq&90MVPfM6WF4`ENE``_!#^&85pT_TD{uM+!j2gP_~- z$6(NZB~31wI;87McuQ@Ir7T>1gRpJ8vMn7KUkzo%OavU6Nol%u z7~zo9U21(K`YmRGFoQ7P#$7$>SGbnBc;~bBvICxBRc1TFa|ql=K}wvW5On!g;z0LD z7r3c)!>)%vIkm{H-|4j(-dv3#S)DB@7y`+5OW=<>8Ng}4+9~(r#>M{xfVX?shQQ2m zZ}Vu!5wvcl&u}m7pSK3cPxTIP`}PLNERC7cJLVZUvqb!@tma%vCEHo$fvNmFZxx$2FZN|&8zbLg)6|U+^POEPwx!18}PjhcUj2K4k;~OPwj+z z4iF@|O>^A>s-(mTk}5o2GE$vr)5=~;SCKBxoc#W##Q6nX?V3?fp3T6vQQW&3`BE9h z*E%>FAIa_1?EWldW5K)|B`q;pXUYhQYRIf(_M8J-XaD&m*t**059T|Vqu@4$Lj08J z2NKOKw0NNl*-F*~n_2%lBCHcwTMb`Zo&A}N2=u}+*1>KG%@L)9p^~-kv<}4qMDlAp zA*G1yYLR;NLM7UcJtT|2^b%R7lAsK(ehtwE}K(~m4xf?#@%9lS^ z_o$t+>4NmXhk<|RT`S5$n=Auf%`Y7pEh={N1ks~c6cXwYa>v=MG(*CU)RraGm~7v> zxeD$3Uq+<}*8M9P>}I0+d7^~#!9;EIXOLej5hOHe!J~|_^vEfy@DrrV-SEN5r5H!^vET1 ztv`ORZQ(9;c=^WRpW!UnX#1w=v+4ZFq5w-%K)q{`TBE^K{{vWpNmh*I5%(SVAH;{K zH`~SMt2QR3`o_D#d2j2l%WtIX@Kpy(2~Am9`yZr%W~Oi+PU}lr%KLMJFKdG5Z^<)P z9~tk>Z1hf=sHWw%eoN{5?H9qUvO4Sj$`vyJX_JNp@nQ9+1HQtj%621XTNw$Pbq%*N zANknA_8$~$=mV-1pY{DKM`Ha3;ijW_jWG)>vOd$@&n)?7dRJUF`ohb>M?Fk16kotB z>!wRT7##eHEm?0&*pN?CY6bsV;ctlwxO~Z7R7*4(n(^1Gi9R~7QEJVA{6rScSJ^gvc=KH$BMpNJh=im8j zL52p&E#H1{u7Y^;R~Su4#IjROvGginxSaXTyw=g&4w1xsDjg{4i623#lD~l{eDFus z{+p0N@A)-V;vXI%aD)^}I#DsuMr?m5%0x)>fV==2L>xesY26Fdg{KU&bpiarB$6}^ zri>{8$5%lF%Q#@YwPkQ=H8`-`P`CE1;i%3y^~cXIUO+%Z%DS5F#J^BUJkxVrD#um- zYiRock|On*NB6od+iR&4ZqkX;{TaGMX^%^=IW3rS)$7KXlph4w#tC@=QhKtow$AG_ zTKeI|mhZCoCL9ytg`?Q~Q}{9vqxX~_YKDs9j%zwJjvsQoGv;|QYbOKY>7q*U26>~q zHrFq}xX{Le!}`+|2x7>bJ1!nh4?W9m^gZx?0Ta=h18O+5#UT%`z!iL!{ng3^c1Qh@ zk+8j}Agjy=?*~4!6nCzoE#2;TVqchF?RU5Ih^mG#zaM2t&tGaM)Zcr%EJTiss_$_Z zWjV@%{0|`zX;x9_^GM5E{3utFw@f^~xAKDeX~z78SV7>b?aPE~=HYCsAyy58S{u&A zg`3&`0CjB9-qh;s=cAAgwZLXl9DZ)yOF?U(V=x-NJ^~rY1NyqlRBB?0on`4*atZjV zrAP5iZt_O$GG=x%nHKTzHXdXEd$}7Z{r@@xvCVR{{@2mOsq6T31+MBZP#Uhct;O@NNM{@su*Vn1<>RnA! zni+9^!SpKbNE__B!kUjQmAg~iuI)$yL;H!9uRi^Hdg>E6&fFlEK8_nv#NjT-9XzIC z90$S8;|}*nZ_G>YFOgnZ3wjG(hFv{KfrC%YZb=g-UBIt&Ts)}FL?9!NNC)mGK<2B1 z#!@w{|Du+shsxvp3yCOjj2a~owfZh7 zn&K&O3#ZcJ0*|u;13y&N*=NpJ*+7JKA5RB7yPAH5yRR=VXsJUdKh@%(rM8!_*JtU3 zR3#jM>}`Yh>AQXkN2p%bn`F+g7NY$|63OStujyNFnz8pjcod3`rx<-w;j!+w8OHBvLUPpWMNYu9-l7o3t}uS<1$Y!dZS)Md|x z#q@)T)u}YA2!p9ws|sm{DV+X>-pK*h=2%+8-JdFcH~;L4%MFML^iABWw`?8*Pi+hC ztc0}iy-WWtH-%K&pQXll{~-Y!GC7x@?i6+w)) zu!)w9-YRWf$w022^xt7#pz4h&9L@nIZRD!77171(F>)T(f>lX{d^_#S$>)L_RG8s8 zysB!(js0$*gDQp}K39lgGtge-Q&O-SOVsw3Fq;^xD=0Fkpo#11hdpG%=S>{`920yw z!Q!j_ki{g@H00H2W^#lsV3q@=3<^aENSk$dJnBbQW{vq5sPSRr!m2zMDsRuQcFMSIE6_{wM!!xQO7LF5D=59^#u!TCgDYls3(U87GyqgiYFSUZ&Bo{7OIxYSW>V(U|J3$N zlH=#464R{XR#npsDG6f+%XaWiR^!8G6|4#uIBrG6QJei-!0QyX$_%N2sZst>9oZ60 zP?btZa%r~IT&e+Ts@-uKoCgY?RK+0?@Fz6f;TL#CNo<2~QSPMJ&d0wB9rkzAG9ONu z1Z;?j?gwe7UyF!!?YkH8`_9;hV^YH}%Gv5xmQJU-TaDD(lt%mKScqipWpzj~eTOCX z?=$z&`03{tJh_ z=`OJ_^0BOiG?Kn2$i%qkd{RZJZMBrQLW4yw4dgV8bLnS zJSC`J6l*w*f`hiw`v&GxVHbn&>r!!}C2$7Myd9n|$tdmVj+1;saP5Lj^Cg9gVJ?zK z*By?JiM^0wd*A^ zuo{59SnV|R`7}i=VCwOm#6oABb}5P(Zo?}qAz_K9Z3qMSrSikLm+ij@HWIofYnK0E zOxA`+gUxLW?e00uiv|jT$#kxnNj7CYHdit`pck)h3Mv1LZH=Cl)MljGzaxvCmY7yobQWO{n&l_Era>QcA~DzND?f*x;<`ipcB3SRe~ zND!LcWDxj}0tUM|=TG$KH*u}$rHb4`o2iPKg^&ej67MJVFF3Z-{9@V<_j^)tzPO{5 z7o}I^F#TXx2scNAiEmI9&cwk8;f6w7*q|yW_F%5_u+S7$P<@TN=Dz~p>x8wG6g6y9 z#U<_}Pf@$WcbJ;@U>N>Bz?XV(uh7A1of2|T^`!p3zZ%(3x|v5*_Pm9H`WfM4RgxCA zM5WY%nt*ouc%pFbz!(HX8| zDt1+S<#b#BpYLT)6jIuBZ%V*vs*oJmnxeG(vMPg}_*3YBj;s@2{IWykM6Vxt*~($$ z&6K7}NqikpJfFim0TzKfXk|XckvpWR`^$E8IpXgnp&e)@2s(HG8J7*I)%$prgIqnZ ztci>$iw!^P+A6l8@ecsG{TO=36F&_Jp*RL>#=QqKo_|P)N=b;Fk=|{G{A^(cwt1?D zzq(}f^`1nt<3Jd-y_7SX>bJpq__|t^{VR4D-q@BswZXdki?Xrt;keY5K3n41C5PnK zcP_NsoJq`aO3!nzH(7~J#2SVA&h%SA1=(Gz(i@gYFY6fo2l=r5NWhHeezbpW&+vl3 z+Eo1cf`%Zw9aM7{FM|>860(rnTyVE5Qbe>|&`p(|9QUN*;&bM-qV#oVW!j#BtBx{? zdSAJ9br`hpUh49A70IqXBpYTNJ0oCHzID-@rxRTNaT+OAt>Ms#ETG^MaEFuGtY;%(Mr*6WX_Z}tu z$zxiVH?-L9?BiXt8LI#fYayRFB>A%~Xf;N!$1mwk!PUI%yzbqlch;LiC>&hP#2AKM z{}X|53&QVbAt_qtC}kA*yel!;z-H!S@bBK$j^tc=35vy`9EC8NuMV5AbX*=49ESum zZ!8UU&rj$Pf1+DZwiMNr&hGRXg#pA%Enwb78+QGBuRro}iLd#M?9Kyr%D-QJn6`KhOzBv&6Ms`g%jx+d;GLT!S# zd^e!J6G`mue-?C3@?{~ITE7;@7<+n73p3cd!byzLoJEx>yQjm)=u)kF8IUCuGf??p zO4ateujGJ(P7Q^nH>u~Rnw3kYWL$#*ZfC(jf(F^fmxI;^@Kec1uy_1+j(KX~?o3K; zt`Ku$$Q;@zb$hni5dpB%{1n=~Px`!BBxWTl63HJIui@U6`RFK_fxmpQ=j1V5_~^Dv z)Y!9!zFg>SF}OQARJz|?z{qR^E&t0w>`f15UVDBkzP)_B+k$EqOV9p`;bT*6Bi|AzwqsgwHqX&}e zB?lo4?&N47bp~V)3ofWyv!P7m-OK^YOCac>J)*V-n2BT^1Dl|yD`A={4GlsF}fg84dfUZWM}iu20m$kkmM*B;VTmq0AY zRaa2`%1vABKL$X}JkE2*8>_`ku|4#X_dM<{?%i9gSojAkplR#V(tmy>KS+S8H$;h_NQ^#zBpph~~!} z#f<)Zg8WjORjo{qQ44SP(-(1|Cv)%oHGLLdU!N_=RZ&r~n~blcM$rNU1ZBB?gKrOn z#$G!P5~7dz%=60pP~{6nFUN1k>L~CmhyqVrNWEMlsu`nt4P=D(HNrhp;&{AI_8XZb zSH-SlJi(8(s#{3V3Z<%pMB^apf;%)EOPFKK(q|!kEf)#%hX;MgRXcCT=R!Ja%a(C8 z`~_;K6kYj4w?7Fap&3`(DantcM-O+=g_1KVXaBbHp|2gAdv*ugJ?sH(EXl$8#$N_4GR=#i>kcA%V@ z^OirVfbER`u?ziC{aW4IX~~|upy7=v+jrA2!AtYg0h?;vZN1R*f85+BEo)O`jCb^n z@H@3*Jq-^EKY#mf8OWZXp5!^0iX|%%3i!hm4tsb&N7fPUB^>AFO$qlQ?}bO}J!~4( z08yBvwa4>x%HW0&NUGZrGrb~|G$E;d_FC-I}ekHtq(-^|jyzO&DnTuSx&wZ2Lk{5KYm7S zXl|%f-1C4BPF9e^iwD7~M#FAEr~4@n3p`prvIbHO51a~X#fwi#=f2=PCyI5D?!clTJ9|{H>(UhGdPZY*r# zKbO+a21Y5ZvPVVUjJkPi*h6=c*|{CiiC)dW-2_oG{R%cs zNXgkPZr08hG7FAb`aT(Z7AO{m}b4Wi!@>zs!@BfKYJv*H%Q`}U`+rNr0gbSY^NCVGpVPyexc`_JKz31Dy{I+ z86&(6EP!?wp$Vs zt96Y@_tgRq@-Eml) z-%(HMv#MX!cdk;+UW+ewG02PN7dH5yZ$o0`kerj!rt;w`w$tzLiGg7(qS@ZI4Rq;6Gpn$AaNfnwWN#prz zd0912M)_I{JNx_poHb6c6!4$q+xs3ePm!~ZHm$5xUe(XQ&sK9no^*mVh(!hGg?s_bTmjQ^Hqzbno+e~oQ~4e7 zR-5Xh^pAl&zad`rUVbeTOkbw%We3J)>!}?%)U%uPM!?VnPERv$$6;!4&i}x@k$MVV zp!ab~Pm_OrU}jh z{2#DHll5kDQeldbDVv4Vm2i#G^Qe(_yCQJ?4-vz`uyU!uFnFX-FF>%@DChtQgPYUW zdJYJ4J>k78=C0~5j6)*b?uGXU`E(~ZJr6z&Q8oPFvuO+6wv*exZ3#c*$Ip}p&AI26 z?{VhLD7krT95*!Q2*yIV+`m^Q8T_)_@>1-(%FI5arrk8Er@=`R z=Q0fE9=bm$Gc$UvV!UN`D{@Hu(vA~<;OW*)AbVAd%K&{1$E4>@RLYF$GYI8Big#g$-Cj<(zqY~JV%a^H=LszoQFYvLA2gS^(jv@3i z$1YDLXV+%PCSyGQO^hx)y?9Iy@O}C)$DAD~Wi+*CTj6uosCet2oC&0i*hwi&pzE{A zE8RN#TeZ>tgs<1-1B1(FR{o9%0RND`4(zB0qB_MP8>8q zoe|6Av?nd(%C*oO#BLSd>y;vKdjev z$xh#<+oN{Loh;N)Mqg-|=e=!y@jYSV$lacr;$lDMWoMlK^jzevK||7$qSZKnyT8># z-?x%u(m1weol4uq&jEy=84-|^2FPDL5b44Oq)DmIGp|zm>gGTtkW8Kk$L#ob;cTv3 zBSdcTTlrgu1rdc^`oif+)~D*4=~?&;a7a53h&Fgw$>>EMG-Z+%c%;>oL5B8B+ktUp zTvEHHFSm<#&(Nin7vs(ku-cqcw;N|Wr-OE2i+3Yx!cVbcPQ*Pw4np6*aeogT;~tnt zrr(sfu&mwoxk~U7=vnl8H@ zKLvzw{;^{BZyrFH1iY2?wRsWZR8ST>({Eoj_;#w@n23 zKIg{_4olB{$GUznu}kRFGi@{7IeWv80;g$tidC*IO{2U~BhJ>IrZq1^d8%u43PEor zrix$~wZE}PHt-@^#PI`E=~N;^ux#^#gr4I5|1-eN1z7e1D~rKG7MY< z*YC`eMH2Haz+HvWI#?ssg=~2>K48UEtBe2Eh~2g5+1Y-=6n%c%mkm%{A^ zU~$YLYi8A%X6tXTAb&Z#)QxYEI(5~U7t{P!u%`#dZ~U9AZw4+ndC7ecl%EW2X0&N( zrj;y@CO^3+z^omOLb8E;Ufh1fY>xD*MBWX9B_eaMn;~bUAaMPFBhz=Pgm0}*U}Am$ zC+}prn(6}oT~vEaSIU^I#x_^E%36J{a@5CoJAcGhJwV$ouVE)oPp&$FI1$_==6Gydpg8a9-ODJ*N-xC0 z)(3UbIIo^pHZq2v(RS^OSoh&Z|En8??=JVtTd&Co!atQAaT9%d8zR6*rqa&E{;^ii z)MZ8{uLA+|9Qg_|duX&+WmPhxG}!8JJ7a2xBe!U`JRaL-cWnO(>2}=WteffsR?`kbBoGPw;}E2otwpOonbedy%UxpG;5Z--Nzu~xPW_qA=zdcXf^mH}k=Esg_{{t?{xFJmN258cu}8gEV-Enti7^4ntTp2F$>%g++?%OYKfANn-KNw%R1zr`^M)z^ z@R*O|rfL}~>j`af(yhRLs5S1YyE(l)L{m@E5v*FpOjp14_WdMaUPcjcJWF=#j|?ILK#F%euJEW7Xcp z{?P8hr`F>;Bx1bsM7CfURa5LJSot`5Fcj(HUE7J^ef2O}ZFGAr3A4+4CQU$_Hsn&? z{XA&Z+~3CfCPI-E$=AI!B@JVy?vmh4ja)T4eexqe` zY9YwPqz{tF_FQz2Py4c9)X8H2Lzy8WpY0oHE@{bX<~#Tz#268}_zYZLb1{a=TD)!@ z+b!?-`oBGzF zeD2f*jMe@qESR!6Jx?@5zctV+i0S5&1s3am7MR!M`ZWvB6SFc)`s6t&_vZhayF&b~ z_>vPsE`~-~!C2i|-~Z|3_raEJ7AdV_&^n%2T|&EFZ!(Y_LiYW2A)o%dtjSGcE7F9G z?>9wZ*qY7tr7*6q8k0P#Fix;I2&pr5HckX7&1j5%lm4BQ9(W&qso5X$$e1d#SbI8m z%}yf`u%qWNIJX#bQyI|NWpUK-ivpH-^}XZ$6RJ!32mhCz?`z>+`G2y9~Mc9d%o_QA#t`HEDnx_i5P;>%CQNb`*|1BZ@L`oOjZI18EpF z)h>rqr0bJltF5SF@ly-4zNr6ZZ=2j|AKDs9>4P%k#-n%hM)5jzQ(ufBdBUO>pF_!R zyTl)DY7kOfztM;;LcR0sFt#R%H3}O5md_qni5+I5;A!?l3kmI^bsyV(PZ0^ME{UT? z*z)3M+q#Cv6p6jHSn_ErVjrO04E9}gcN3Y?-5R^Jkh&BAYb1X?{UzQYX(b+9LvS=~X!)cEIxnC-Zx2#!14>s-0B9QF*xTpA*+=Z(@=MOYi$T zE2#+napFlcDpOjQ!637~R6IlEoope4ygu68YESzLMbzo#UO5}~F}0-2Ui@lE{LnWh z%5$u!skrqYHQ41W-RHOA4-4OXO$2dp?zVmW3~AGW>xS2n!yvs|;8)7JAAS)Jn|Vnk zfy>7lDu7+z1I5Mys2hS5665}MDf^yHyG3Mm^S&nrFsq?S( zBch4L57=n*l6}blMI25vO=A8%^5AW1Qquo9mE>KJ7pYQTN{{}Kv$kz7GEEv}@~Q!9QGD&YDUl@C$ZUKj`N=hR;{ zuCCO<_FAw?tFT(*uEq$AtDr#G9d+mOLsjFR0U46M^U>zkQ^)a>hwg&WoaRB4_n@zL z_+Bimb=ZH@!T*D=8QE*iZ0$;47p?cX-;I7k)s$8yHDX=XmN;u1Pn zWiS}Jn?J6P6OgEGY`Ytv%sUnYj63|}D7AHDsRrw#&X0{(Sq3m#s*hC|X~s&^65yFB z&5?%aTS?g~crn9k-%865 z3UyKzJFF|iw>KoA=tRd)tXkNXcpudC%tt`#saJxsA0$OAv_5+yP<(y!Xa5QNLkEM= zaDr2Gz@6(8!T6KD>YAz9REY`SNoVg7-u>i!t`sa)k8i1c zLC0A$oBL)9JB%9Zoit%%Io8@=<}3qD0f>gbr_qja^3z@~J6h8TN+Xidu;*UH@~!eX z4PDm}=v)%{w4oFH`S(>n!oBKjyjIjk)CDzk%L6YXe32m^$3-q_E>BEj_{1wi&h|yJ z_{fg{K4t*cb}WkQ@u)E-Rx!U7J-nMP{SnGoj_4|Hf04rEl1Gm zSG;hhsud3h^`3-^Ap=GiPwnjV;qqOc{Kpk@!RQ5@VS)vF!p!<>MXsMbQJjLeRNubE zOisHnbDM#$EAg3`Li{clqX_Zf;h90z%#z5JW}PPN=tmP)U+aUg7H5S#vAr|ie72gF z!hkzx)CiF0U2tibzSjTOJV0_8Mz|&2SW4v zHbfW6Ph=YHO23>lm8HJZ4Y2BF7)E}|qAj<-NAO$#}- zsphL*!!-mqQuYJP_sREYhyCPyfZaNld#r_Y$BIsML${*ZF7Ia<?__YOhvU!6 zu;0x9pvNHgZg+v!N7p2F`pV$O^QTLg?(CT%)`2{6lh&f)B_ftwED;&OeVabC)*rwp zok^bI7F7WI@i8X*fZyqQu*y$#{NE`v$rLm2B55!(7b$4q}bYgkyzk?%7oAPmp zt*z_`;QHm;!q}+W$m%{0V_@_b>ixDP!9vAEwIqz|?7IjQH4+VFl1*UrZ2D70E-GliVXd5%hm@8gAz6I-OtPR@_()s#ebRwTtiXPS11)fq{wP@BbW*Ajo}3^v*E? znr@w#G3WPILqQf?@anzb1v{Lqtb>8Jwzh!N$+BO-PUG0ia}ys`M8_Poqv)lAs5Hs% z_PPil4gvu3m6zb);AGcTo_a2Ne!K>ywHJZ{-tmzC22u#@eI4-BI>1BI ziWUuVzV=7|%^FDv{%^Pc0%3prwtxDc`;YuV22-{A-;76j7c`gIYqzdYP3rQ;{sP!< z$(_6ySdQNj%rWaDDBhlOv7xF1wrDLy zAI?9V^z7j6r3C(bDdx8)dG5_YZaZllLtIt9T^mArokqgv9{JJFdoi2deG`5*00CYFowFOj zTE(aJ8vybz4@l|_Y3gv^J0^^u5- zk(l^W64DcS9BnuP`ziwlatFH}A+HxT@2%JOtX-F1%37Mfd62d%pyu|q`FP!@bTKv8 zS6a)>4OshdoNsNlWYB!KvX4jl2_hyCg$Z1u7aA)_RigJTlZZ`2iv#xGKmR}e*usqx zfc*DA{U2Zcxg3`ngsFJ8RLL|F-NdPQi?6P$eK3MBvgLf(kNJMpT$a;-ox`G8zXKHB-gS1mz_1 z%1q_ggk|rAt@OQCV(+2TYCi4NbsmxC=c9BO{g>$kBdw|Xl7tT{CBHyFM-Lrgd`)Fah|m@+{>Vs|F&2EFrrTZl zym#!sM`x%MQ_ybzuM@FCk55c=9f2-)>I@gRyH?DG>g|S9ceuDHM)5k9i-9cNvADS> z7RACXbR0wdo(%j2^bSV3ZW+Bx>+4SUdS8fck}k` zl{t1PI{Bn*gd&j1Vpop{6Z%sqI%;|>GDY3*>|h|LyDNI)Fvp^iSIlb&ospGM(JejfPvE9X8V;qSTBdLt0mP_{mqc^c@zW z<1Gd2ev>}^&aS&QuPCvlOMaqGhZ*$sk#JFMJwpX!S6;_Y)_+0s&wj}>xtg=%nBLzv`k&g@RIPBi3L^k3e)c6EBSuWZf z5G~+cob0Oh>-$)$MHEZ-HgQYL-nYhbUn~yz22I}zS_?oCl509jPQhd+S}w^iMCPQa zPAmeumk^xF25CCc^c_?110j@O=nfp+&c-x{x*75>%m&XrYH?ROFY{N6e@SmI9r$<7 zXuUhA3NaMT#BMFZA7sZ%&wC6~)-P^?BaC{vqi%w(il-ffpNTE?ao! z!3zLx1@9ftuL$%t+lAkI@FMe{A;I5$DyaEsll#*qfXMk_kJ$b(uY0FQJ}rlq zt8FJR9ygj^06evSztCW)>sQu158w2BU&o1)vJy~bj;wE+8*_nmb1d(tm23b%IL)X@ z(wHCxX7Nw5z>9{E$p$RZtZ~mnU_Vxd&6ns0X6_Mfo~(Ya7MJ*H(|FVrSmUiQ_dG_W z==9xL8I;mdZJbKhDQD;f#{n+>paZdhqZ_A*coZ6jzg50MXkgn1TN)Lx4^h@hU)wk` zK+$-ZG+(240A119P0REK$z6-!W~pivGPH;iIOWBx?pN%ml>V_VwwCZ0SuvS<6C9r0 zzSJ)n0o1vxpmqr%5mp$YFDd{60`{1dW??`?+(lKQXi=Y2c!RI0eS_+H@5i{e{O{_D z78&J{x5;0siU>vPsiWuZ&JE64`N(89%UGT@GB!tikoD}Ab#Sc+j$cQ(`c{+>!5HLe z^b$+YHrtWe{I-X9wC6Cbd-TfEL&-J~Z|7DBkU!6PpbKgCfDiHX5(eJ2st$)jI%?ZN0F(Oc|L7P4y0!NuiNzik;8ki*n` zifYEwhAH=PJc@6*d50~NLRY>&qlphHY>K5&07u)puZkNW_HFxW(89Ak8S=rJgW8msP@Jcku-vkcMFU93G=&40?6kKyL`PXsU9L2h^<;9wPdNa8E7$SV z3w9mVwTQk4#!o|DxcMo6LB)iQ{UcP^`E$$&UW!D)_ipC&+LNfi1Fw7NKu@9A-PWz7 zNz!eWiVz#cUPk2p?sK9*%w?r&Aj#7634QJj7%%#=rr&57=d%d$Lh0&`q6#3tc?kK@ zFXT!HeI@bhjDczOco=Y0>8bW&)I2KevRLkLUrXY#oR;QHxO~zbYoV=Kv1XK-02u5c zjRM%K`W)y$<)1n|@Ld<`iVbzUelLiR?kqx7`+?ibF=I&>$#7Vfm5a673c0%|3g&x8 z;b#I{S^*%t(VUreX_emcTwcdvw6J;^MM%kn@waJ<^{CwMH1Qo5fs4T+mV-HEZ5Ja+ zUf__R={y8?+5in+jQMdsG{c#ns=)b31Y!Xo59U7=KNzW_Gej@RR;nrL6+>G% z8X9gr`oo|{Z#3Z{H_wQwt*Kvlbno4W{CaYw<$KhDB>tk^j(4d|6`&Ywn(3(8ZULcU z&yVIapZKWyIAL$1ZD=u<)iSRl{3YbFXQ_ExP`-K)nGS|l_nyp@T`pmjXb_|bHsZ_f z={1h#7sD>-5H<*^O87|_3~u87<(_3k^!gg8-ic8elQ%`z4U_^jceN7K(H=y?@VKrr zPYNZblr!77t*r!Aw#c%c3I;JxQK(#`Q_muV=LG}c{MGVUbogFxc&FO-2S7OQP0WYT zdKTYjE+0@jn>^VkpH62sBY_Rh2phczr-FsjARXL_e%{RCcnkPESEpmc+sgq#pEdK4 zxy+a-orAB={0Ta_rVGD-lS|cSo*efwHc*V0REhg>!DNr1pAggVH~-8*Wu{rs#QZQl zFAkQ{i0Jb&w`{2^U@}F$5<+5{1Mw;F<9poO<6z>6V#W4(kP)Y9S=|Mxc*npmEJ2xC zEIiS{2ne8>1%7)uzHV=#oeWfKhi}1wuG4r+BclZ#>*Cj=mB z#3-bl6YB|0CC%=Ub8xK^75*~a*0K`ud1(@e+fM?@BnX|7P)M`QNmdf1+Q6we=MD?H-W1R`tl6rS2&b=udATtD}CmsI?szJ74A`7@eRfu znF0Id$>GW=pTBVlR_I6%X)&UBJ%~WjVbO)SGB`?tV0muoI1!h6Nqzp0(Z>|}wI61` zJQndk)r;~`fSa9+kj|dKxH6RJM`l`p3jAAW1@2~8ZIBqsgb91HcCy6UHO)mqk@>)b z7({@gUkhr;!65RCAuuwUr0wW3DZ&*pDj7V6KQ9BIAc3SazQ&-P1Ii)#?TS&Y+adQ66npcZN;tMOH+hOZf{tXR7Qc~;s zm&9(vjzPhDGw=(;`@U|R&!`=tn&()n3G!DBGU=keR#pichS0PoM?QZWm@P8s1lH{i z6dz|ReLcvodigc7`J4ANAMxd#oj-OZQSbUaUtje zgg@5Hhz{&MygQ}Bn@#Ai?sCnvp)deGOd2oSuF2bf$9Dv2 zwWsPm3Ks-o%yv_O(dJe`nhj03nvp!Dt{Oq~oViXAJUIwoa~;pEF4TFsDcLDebv~)^ zOUh5puhwJzmt)&=3+)KlIBdF>8~RX^q^Hi}IKhX4Ik_dW;W|ez=#-3yrubc(e(^9q zt{x^1K$rs`W=D6lXKhhh;OkHPYQF6C3@kJSgD|(%iXKg+=wO#r{*f^%g-#LJI4w zAP75|oPNDdseKHI81PhW+g3gKHg=$ayJ{N)$)CIVp@(e|foEh$4?SIhsFu!>aw&$> zGjE&qy^b6(roemvpZnV)+&Gj;@RR@(crVorPEK`OYCs!2IvPS5i#nnz)L;R)PX?2L zlnc!C+AQrU+tpbU@&y85F4(S6nPA7Oen@zeGSc<&r%Zd({;`sa`FGtjHmj?TCeWK* zKjCl{q zpwS{SzvbuKZONPfvBj(0(`8}C<_yY*Qr6h~=jpIt(}tI{V4kt|D-k=RJ>i2=^^)YU zJ5)gl#Ans7eTE%uh4OottK{Q2z6Su)=ak@!%fH-eg~)eS$Xz25s6)dgTvaX#k#B_g z3ZnBYeT0HbW}y z%CL`Yp`EVUbwp+a{sm(ZVKU)d5*5Ou?&P@BYo19%9cZl(sPdVgQp{oMTK(!q zcH<`6OTw-N9qsh$-A2}y9X@rqT z${9TF_)bW>!I_Sb=ffalDzl&;+K+miz2dEzEP?j>m)|j*(G2eT8&|(KHKuV625%hT zc3fl!G^PrI=nT~{%Zdq|+Kzcnig{NsrxY)@!hY75^1B#6Ev7wAh;6%c;QmnJ)8EBt z&K3-6&iM7Tmq@58fuK`tfGT&!24hZv%wrn5ldr1Kp#v$}+CjYpzwK(q9tMx3c{w!c zTBH>Phhob#cEG8V6Ny$N3S_-6-SJP7-e{~7V=LqiykG%Tb)sc}g~IS`!BsZo( zL95r|Q^BNJ1!bOy?Sf^N$U#)|mv|&vfhYKG$ex2btS$bHg5=t5(zHP^!c^1nlA4pk z_xiI|4=Edc>=P+t8R?$s1l|gJDYX^j$cf>>)Bz(U(YI>b1jZRu0Pl`&N|FVBUszO3~a{eUe5a|PiD`8^XJ{$3fhiS*VWJfZPFm)BlP|;O0yiU!o z)VRKl`TARI*wY3^ecf#gA5@5g+-t>O$mR~Axv(D@{=l_ zRP*qv?JdjrJ6z=C-YH1)&!p;t zfQp4Dd%-4C7LWE-4~nplVnOtHUnUK|_j##M&}8#E3TuWlLss$ES6{9l!c9gIo}>;} zA`oE3G0xIWW_-KpZSx=>ooE0dUP|5-!O&Y-`L7ZALCvml_RTA$`|+26l-j$$!{1+| zj#tMoyMzrk&bH19N%U+3@!NG3{D&17bl4n#(q=+0%tmX?0MC8GEAv>VIYkxY!y-b& zN_~@3-$4NvM4$C`D!-HChaTIl#yisYgXz_a&~0bu{?LKW01R>6kx|Cy@hQS?(Qy15 zQ_fu|L;mhXx|?`VQ>2`X+R=Q`4`M?YOh9VqVm~+jp$20oXEb_AL68UpoJVa=isR zA`nMTz+GHteH7_4>3(76?d)y+8cdnyCl8;ah!iymjF9)0=niiBG}J*1a2vC8A^|{J z$*po%*4r~&qe`Tz)6KezL(Yc|6BOi(y7k*jQU!pB zePf1cCrzYQn@}P>P$t7Bo0t%hjqiq8rdNxtw&mZy4uh*Ko7y6I%An`k%=CiiS z-ph=klDwAw;1)y;x7!d*@0kkxn<7d(^!TilD#hILbOvCG2!{*Fa2QKT=?_&|pYVw1 zlcEj`U`!&9dR=tz3z^ZNso*TWOnjA5y=1!tyR!&&kAAv}orLzGQ@xSSDJ=I<8eEPP z7RAt%6LHXH9L;szrN>w&!==kqSma+6cndzG(#@Nk!Ln00=h%CceZ|3#;C@Wwa3OIV z&3YI3_G(;yk2;9Pe7Oa=y|1OiIQt&KKjo^pS>o_T_^pqnK%P=b-S_m{zG@^AlJ`jZ zpiuuAE-dRZOY7EYQz;4VaDaQx4yZ!XR!w!c(nK&O0PWjfNUg*tFz_`xL*!S z69xO)7Vi!$jCMF^z{g<|5;&0dIh%>#;5d=lpq7k$jP~!d($qi)f=J_4DE(Mgs>hz| z#o=#f{F_2_Ti9PLM;JWzO0G1X5;Uw2)4gGnD83@16*~uxGM%Z^_}yqI@aNwg<^B!5 zppqo;h2mRQj`khDe0KbzV;M4bncmm2x#-3i8scsMKP6QxoOfb9D&oJ@>Y--6VRDx& zP{Oo2B}RC%_qBEhyT?bKkzbR)Z9ewvtcj%V{g}mJDR)BQepKX(am>i%9wt)NixgIZmVNuH=~rP1ra?r!o1SkMbPIb zRD>&}oz9gUw__SVON!%`zdQ$GDv&sa495`gwvdk>BRvun>F`f;1@ zMiYJ{Sd~(<%K>e+OyD>*YZOc`z6i7e_z-lomk!+0g9RtfROG|M$8X(SS?JfUG5NI2 z?h~~GqK$?L8z<)`thuUR22uJf{oC1t4*LAs%ej?Y(ze^OT~kl_D*v!uP_c1J2?Z|` z2dl8#?ShpuT)F<12og}MR@88C_>evKlIzgch#8!92}h7&*>RHTA!o?Cke-#+}= zQm&q_>y%(pSnEzuvyeHPL2!lQ&7SX?uoJlN^@&0vAC0;OCJ0rcwQTATq9{|v-W3&r z-aI8)Z7_kza1Y{#TcL7yqS`H~F(CfpP#G2br81shMTniJK8XFqf)GmS7^Z_6CF%q$rjyMVkP*=mzB|Eo>;TKWT3+rRv)-p?q#P+mNke(YmDj8lcMxY)F zV=DdbNgN4L5K_cETn0JV#KoY~Cvbw5-;D+bY%JAi`p7qY9WU%06NZg1DauVO34$TT zu$+kNF(&fglgXVfp${2e)%_cJkrggDDDzaXb3_@g;436SEFuF%=0MVa%y<|$olfBA zj)q)ig8T;M1DWYyD8UcrwVRzt40pFDtXIiLp^~FQ}*q_q6&&uyW0C>#&98j z3&MDFyiDdW>!fmQ$qtN#j~4i~D)9zoD+$I23u2$CMc(>xi-J}g>jedpm~MIX)r%+7m|b=66GEYCwZHo%bW_=a#052>H5^?^6uam7zO4K zg%p3~$G1)O{Js0eSr1)sps~nm52I_C_L z>@A$x@>uS+YIFm-Xg9gK)VwUF4_AioJg6{4VcFD{-BNFc8rH^ArRPc{F5!#AAs}sC z!R%)i^Ryz|o28GM+AZ0t`CGM#BXeyW`zI~z)`1Z97Pu3dFxOL_v^rCL2ajK_-aV4d ztL(6Qg$hG~YMvxQ*0F=_=k6JNhx1CXT0W_*u%bN)L(OU>BsdU@*mf4FX@5~RO zK`?+)la^kQ2>ZyL$UUTBcpNS*r}gbmi(ve&=BYrnV1=9#5Cb@mTlsO@8)6ok=i8f> z+_omlSkg~-i2CuWFh%BY4)e=1Uzan-$Q~3XR^i626=BPR)HO0yRk9y63)jgd(g!yI zZmoOGV70s(8AA=G0V~B1%oifMZNdhWJ@8~GEw1Vh2jUx)=ps9@{~{0{1h_EvHqI@? zQxrz+H_;?~)I@bv@2p~fCto6BPv=ZV$*Sb;T&6c&2F@U_ZQA>mqv^o>T6g>5v=CF_ zA{a>r$=}Q{Uq>wlzLIYS+T>;nuJ>jtx# zAi0~pool9_K#@Zw{lQF&oA?FIg^yb)>qiK*m;CY>oI6aft#3(br`H_Yd^kJ{7*<*r z(;zNQnPPuChhm_+RE*?uh(1d$7}3% zIwnrX6NJ0{Pgj%$qi@w|HR8>yNjF0x2rM6w1gC-c>s8N%U3OC;-&Xm3&Moiw94$`H zZ6$vpg1v*cqLNEFy>AzP7}n!pgWdSv2_hWab8h^85r+S`0;X5y37?fc(rw-B4+EF+ zm$nW>;ZlcytfbaJQI^k9@P0p*SS93U%IDk~DY^STu9TOD#sH3b%}fv(eRqWpNs4zO zdG1qwyQ_bWt7X0b8sS@eQQi%dkJNETKF$fwb{Q&A9P-j(kig^&h}GkoLiQB#oZz_^ zL!~}M@UVRsQ#W3ueEAcip&a(O8cuN4g{gk3t-J`-CHB)XOZN>bkl*^1eJNDe@B6D@ zAO0sFHj>Bk7zIuL$leKk)hg0cAG&LR?V0D}U0pj0tQ8|t#tw9$G^Dz`g23LGv`=T( ziv^=i_N0E;{p{xb*j@8fX8_}E!Ng75P)rC!c81n{JI%d1-2np?c1T=N@}gQy77lYs zC1ZUa1eT~kRt%p}lssTx+C%Eomt1d_nUN3^A$u%1ytnH{%EMy3`bES+$MXX`a-a5% z|H@5n6(UCxQV}nqA19=bO68#HcR8Zq)2{@k4k#9JU#4NKZWZp*&5Hz$iy_MP5J$Yf z!f`F8juZ9M{`Qm;(ONa-qxa2tjdayaxyN-Z^|ZPf_tULl(}}+$r32k&$8q%OB0gtJ zwugV=M#pvZ>G%FelG@(#OVUJYiz4FOCn@#A&sC+-ZjvL9AXy9$lUOzFE`rT_fGJ&J z1~6eP-8GVF{=b7#+XyUBo)jR;Iw~tl#H48B!b!=Iy@L;L;Gb@-t3kXlTyyAv+q4?KDH;T!$*)TZ;3v_K zmb^BWVe)Ko&4e<>aXvL5zJ#6Q(4~ZfZ%_-&(*&%b_S~>%G;}b%B1__h_M1lu#?ty& zO-*d+whO^ho@~ALmz=Dspu8cir6esG0+b|(HX5$*`!o3;@lH>~DZ4Sj%yiK9-zp$1 zstq?69p(eZHghFEEvEfsUSA%93N}h*T$W4~S8gl)-q_;4adlCeJU6Y)Kd#XZjyc_of6HR^Cu5sZlWw`V~q^2sZKb<<685t&n*6-J^H zYBGO65Rb`Wvke6vT|y};H9J6`Y`S# z{JPJ^S-bX8QNaFlc4mAoOq<`->1p^k!HwDuu} z?}NpT!bNy~0d>PHCAR?o}^K=d;Nt*Xk*P5@(%c8Ej7Z1%tvU#ffBEHeYB!jF2t?cvYSbq@r>{V9eq;4ZnM=8SYDa8Osu5^8 zU2<*NbzG53kqq>cfy^-w+V(Z!z5Ho~CSR+5 zgv%>HytW>EzNb&T-X~JLAM4uNmxpY;*4gwMY{hjOe9d&*jmaI<@*2GTcuf{M+=1A* zYlEyUP4btQhw{ghKZhzfa~iy6K>H4DZ9i{2s|-h9zPbNc6>z_PT$Aj6yPjbWe`(?? z$|D?E4IGoduR83-UI!UnWL01xf1NB5RNF%2%WOZv2T-A$9ft|2S92%lU+L@mcVJ2% z?jhtDyA!FF-p|N$j2w?OD#DV)FErBx+|Y5uc((yDEehGkq?4b?_OFOsf&g+xD&#?i z3(esP9#KUm65$*#eg3ZePUba^MS?F6^5XM}E^m|G;rVPB^;aZ0C&>Cea7f&K4Xmf! zRrAaBo-ezgu0_>BL>>EJ5KAb=!Z9mF-dzL`RkX?qzg2Ok2QPkh-GTY=oRvU98!s&f zkJrpITO1rBK&g132-S{gsu1l7wKE;!!Y|V`M?}~-M3>PWAyjE=qO%A8-Gh{Xzi0#k zfv<45FO(%dOMIrV(>NdalO_r>;f_wyB@U)CE3ue=Asi;x-Z|L9695P0Rx~Y!D9AE( zie`AIwmG&f-G2{4*|48V*7nQ{2rlQi`1mp`?Cm!$<3)kW`R{lS9_$JmE$YCV-BU0U z(%2b$x05*>BQy!vtt6*>BU_3qf%?M-)G7It3oMchfD@dQ%N6Hv8Tz$dJZNamxq1C| z!`%j9^$>+OC$718#gPTxa)^D24Mn3D7FTxUhu!?196hwt z_&Qu@Vz+?vOf$R+D%lS4iKpO}K7UKO#fxZ`);@Y|;5wnzfoiuSYN4G@rn>@flC5U* zns9K3cUw=2@pra#-ud;d-XxGs}6!gZE1~ zH(~Dgiykgw&7>(Whsk@U^V1uhU#0$0aAOGL9ld;&F(^D5q7LOCPlaF0b*0XxtX3!L zbv{|_>tTE!W%eWx#>!c3`RG9iz}w*~Fj-(LwEkGCC|~Jm`Ve$DxT~G5Nm5*2NmaVu z^~D9^J6d$`Nac6O;C)PXQ+(LA2F`;NhK{0nX(5D+(lfTF+V>kY!zdl-gxE`;ixm)4 z(|5VQ2sBk62om*6+J^Qn8w;8cHnPVdohHL zsVJkN`-NSqt}#)njU-+Nm&~_Mkf$;}qzDeNAcy&tqZHlwzbu=?J3MIyaKm7;Z9-~Q zb)c}Qo(@t|WIR#C%kv$c{ThSz*e`C(YO8N&mFG&K&~jf?jw7sH>L6TES$NIs9s!|I zjCr9tS+_Em6#5A`fLnM%?xJzMJK1?CmSo(Mop_sAx%}gBz1Ln>orqy&fF#wHCMUII zPigaWnCdVbJiz`KxPZA5p9*T(qQcO}c&GDBw;ZdO%n5z%GS5haUa-kcPwsW>2}$_)N(A?;?VdRXCGiGCa+&!5C!5r z<6CF&ndbrOIhHD@xBP#Jiq!O;qIn|`r0Vym;R*cLKBKe@A;NbNV2`o{gaim}W7O=G7cV3P} z35o8*9>rg`$rDjwDm)Vy8Uy+}a5or((+$xn0oEZ7Fu^?#}Ls-Gy0laQUFao?N zM*dGr!$?Z<%ZH8lSL6PnqI|an&X#?HXBGhfG&|bU=uNA@C1DGu{&mf%rr=fbsi>j1 zrZ-}Ks-P&9`Dau7wMc+(V!#tKDr|zR8M)oBC~KaefVjhD@H&=@zl$h^h%Od7&!7tK zHU&16IzdOxr*Qe6LNS17wF^QR8n*9>($?h-f+aIOr2fODql0#rw`3M|k=ZfcZIK$& zVTAR?kx6dLy#hWr?+{HdDHZB?!jvouqlx_wUGksSu4N7V@KFdVktVSOoeSt9H2tyQ zR}k(+HGsq4oMdT(o|j0hn56WkoqrZ5YSYGMn!uem{0t}yuAU?Uh# z!-^{q;_QmSZe)6eLd=#`GF39i0-fWvTyu1PLHU4U1-a}lGAOq<_BDG52o91hlhVu z;-ir*UL=TO%ycz@@Z%?P={;BEqmwgFgR3aXN;@(Fys8u14P z>Y52X5_EHMeo!f#n{37s%$3;h1Uc4dh4>w)V1S`S`zN5r6jS*xm??4_*R$N0@Ta0arfc9>Fmlog$BCR*_3Tta@!LX% zpR>%xk=+nqQ@KfL_XN84gUmkb8Bajsul9PSPcwIT2HBI-JtdV&+j&fOJRhPqqBJ-o{Q!-qBu zW(V+idQbj?@~AI~T)yi2*z>FHc5-yn7s*yW{O}Vq!dLUpFIN-nX``6iqS{7!OfwgP z(8m&^iLFe{>{uIP3kz^JfLX%?yD-VY}azKzuRNS<SC$YoXSF6g6ZfLxVaSF0JZfAjRN zZw{y;<@EPSWv_f!Tu`2P*8G59#hclw;ztrSgQ3<=t{ReM0MhiKyn;C>0L*;DC8-pUNE0@Ho?2G6!2ev2` z;-(Yo#OV4OPd2x+a`B@%-W7a5oJUR9m80!Gd2PyB^_5@OSi_wLu|dvvt&O6e@H1|9 z-Wl4uvh3N+8w&!T%{2L+JR63e)Yg756k5MWzu=zj^%#8Iegq;c#_rjzOua-0mMv;1 zZN_3pGNbry*Y1N-c?e_vvjy(`Z*3Sk=Zq{{eT{BLpHvQ~d^fNClV|@dH#?q*r~W#4 z^K0`?N4$eyO(^kP7^v(wwj=B#%*b z>2c7e@vln?w#G^)P&jd%J=Q=uH_=!pQLtPgJt{nYWaOs$iET?Ib?k_%!qOHikqFy_H*@D?{sc@8sVL`BECEXBydk4|OS2QwX>J zY>_A&ulb;r?heNj#d=xd0k7fouHk9VN}i$Q8^7h|&?i1%=8 zI+K%;S>5o0PHtw}J2U>00;d$9v{ZNkUE-l}m zv&0M|ZJoY%;_oAqVon)bQ*S91nn-q%LDgPqsv(czPklYUM*K%<%2eJxX?OKedo9CE zTK>gjGp>@t(YPh~e48J#XMyp>r|rP`(O9mj=?K=iX~vr0H;Ya<1PYt`j|S}xFT5iNfj(t~W62+n>u;fz*w(BUvjieL z^3S~Aa~B65zO@zKRl2fUL<&EHrygs1kVo6fIHCoh|7Gt6?_O~y8)nV4W@HmmeV!da z1zozgt@Fk2wS4E13_!Uxvu^qB)xf2tENmI_EUeZC+2T4NP;U;u5vwX)9+VeyN7!of zkY1%Wk1_1QoGG*S#B8>(io3A-Jm^dCPhGQ@XTdR++j+d?@kDm`JdO6|a&i{wxRJD| zlnv{qm3I6D=eL@E+Qwvn$;*4L%l=a4clC4kh3*V-5k>{7B&?)|+@p1v3@S&Da zOxL&y*~y88qX$Q&w5*Ekc9%zM%fm?h?dh4v`e$bLF_l=q!vBa>pED^1t1{?i@m97O zNZ@@nrz9~)I$6%i<>yIbd*HZg#x~!eI+PaD%N-FUiF~sOdloF-^F3RL;tvK_o81?iqO#_d7IUtvp1{PMmXaqo3U`&)BB-PN3>m~a@v61_!e{(%SA0a?7|)rrfqP!V*-`=9 z$rG<*>XVfiM#RH6ak4TD)j!jrheh2`jNq9_nEldf;R~c-z9CWh&6ZI3sdCAp1G*8N zE!^$b9;W++Stl(R_4&~{w;jHaHmR_xIK1q2uLSr^^L>B%%By7uFX{!>|Ai7?v5*~H zRS*S7a~k3rNt+3FXiJaTMLU&sGtRk{EFamtFCJF;>!HH-C?(01cd>QD#O_5uwDu3A zZ9oUDZ1qN~u&M_4$0wQ9fTKy8C{EwM`blGPbWWy4%r;mHBO?g9*lJaAu2?+d9nhOX zfmA-s<%ng)9D^nuey%;EWA8eSuj47;r!u&% z0s$`(^Uyfrc;?03H|SK6Ie*f5w68G}Pe<$X5z3Op>q;)SM*l!;KA6x)^vry;Tz|yX z)BFwa{fwz%_xlezLA#oGwV-WX>WUDVU6~^QmT&0A2(Y$zaV5M=*qHD+z~f&Wo|1+R znM*_O&72~JXJY9C=ywOk0~`xMjn(?XiUF&)Mau&RwG7_^+?rV)>9C`X^7doY!;FEo zOY*H!!6P5E=Dvt1ZYq2;57ZCre<~R?v|NmD+F&%7kC5uVl;F^9;#pl*C+tR$OF$W>ILX`$#X)g|=Wm#60`KaBk*MVCXL`!b|H!Gk zZ{T@-7TQXnimH{$M2Vd`f|@eryK6lBH|3<0Uopmye^WR3+q&f)Xm-92ggUmtucQN- z{anC9NW_DtQPqHQh#|IIZEICWsfC@rlE#WXLN`f!*3^9!*&gmqU-u$@ssvhR|IQ(Y z>+M2&?6VzA;_m{zyt12HR{54VdX_f-N)5SIK3UrSo91C2k?%!+#QO8q3v+L1aAjIN z(9Vwax6sk~bVPfyt!sJum3f9o)wASc(Qt7Q{_C`PV5-*RJR!Q1@kcD%T1)~K%HY7I zZ$)@}+=`6_rSSx-`gHbVTY!O)szf@(0l#JAnmuF1p|;~%D%sQIuOoIqvFnu*FrD$b zT}h&|tFl5qXimEYVdtvwgNOE-k@}pnihXSAosc-mw{*tD?+V>TTndAF$bZa)66B1b zzwzakUM8aNY;^ni8my%yGYC<>ImQ-Leoc;@M)KSjZ5>B}Lpd~a^J{-cOwIj*m zu923_eZnnMCcj=Sw2}fzVm%i%md+bQuoFd9U+;u4p@~fRlvm>8)8_J?pUoPKCpTUY z*m>Rmm6hJQJYwGkM%%NC?AAOqk~!Nl_Cxsl)}vlAH%Ipf-sd!`e7eEKI@anIT49?a zflk~3ORvsPcw2s*2bTe0y;ImRxeU&1lP@aJ96som0imlJ3@}Ybi`N#{F04kT16iI2 zB&hg4PaYeir3mW@!}imj$*@_C7r=fgEu|<3cf_~tx>(Fhzpu{y^RU15>U&@EW0byb z^0@YYA~JZJ%yhY80!OCX>8K*SO1`OOy&Zjer+}&{_Xa5-?Wwwp9Ml~S9xg*JAf}bk zyI34-^V=RXcgF3EQR1H=u%v(1%iOQKqc{ z>WQacV!w1Yb&O39@*j_Lf57KUQN(iouLjfeF6H`o{~zOVe>MYx%n3mJ!%l}1x2OvO zH?PY4c0AR5&aicR8WGn**qF-`3%VN^&m!k}Tb=q$`)RRB)t5&MdWrO%#EDOtYv7)iGL7e*H(r>Kh*`L4zPR4Q0`@|$$1dPMi@ z+a;GKP_RFjbK428`%dw*-yFmOAQA{3LxsaF&HC)#9hKG&Ns8E)L;Rox;r;68bLhOayz}A`P1ps zt+e96*aYg+-?bRiY|^G<9ZrA;lNl92cXnyqx*wF^xSN}yFl=BEv69y_5)BK`XMT13 zoY{(8AGzHj}3TsEM(`jp}iEi>O7zEvWF&O!w@_zB7McVI~$DN zuiLP=pr@BZKD*I$-cNUyo7aQy_s=- z=15B~(XIo1Ub8mO&hKbM)?pY{7fBq##$}Oy5c3|6{PM;vD!uwOFAVG{r4$aaAxw16 zfDQWFK8pc8Ri{M$Pb|!K`^sk#cfJihWkv74zOr+HvhsBiSveRg7~2bko9-)<4r|co zMC1VC5|@q`9;H~cgB)DneX_x zAlsnOsry7xkVQ2&IR3%)X)4z2R6Pd8vO}W!EkCe)U)Yr1aT;cz0VNDuloRAD`a^~u z9jcds1=y=h{2=twJlW2Npz*K0Z|`>7vvix{xm|Fo5>UzW7I1;$VZbU?oD1+wA2?22`o!x7JVud5 zvJT4~LyK8sj4`+PWDmJAt_G9)XN8nW^b=;Es~ktsN|Jk3?GAkMHkrEo$9@Jx+*f@= za~eYX@zEgulBF+36lWivVSUPodDx?}Ky&a~BFP3(Nwm0s6LHRyqMAy!ya3+I;XS+m z=J`v=#IlOC+5^h|vEKK7e{#D&SR9gq(d`~@104TpR4%o%Rn3(-O+N8XRFD_*ijzwE z4x!UStCdr#hXP6naJZph7I*dzV2!H=;d|?<#bMqc z!<*U9A+wyrZe{1Gx`_L6%9`_0R`(Ez->zsxZ7Q4{giCQ|fBRBw73AdH<(%g}S0FNZ zCwt8BmvisQ-&?#rsUkj4z!MwEH=h{V)fjFf-FmRXC9qgDih=^};xesu0dM$1E)xAbTO;xj;s9MD6AJ$2aN2<_kPWB~^&O zn2Jp(Zl{VwyW5GY47h33;QV<3jvK|MGVZ!_WjJ2xDG&NT#TAU2gN2`%PSCOj!$S*QDu|YtNN7I{ zpbbs6e(=;f7rNbJfK8InkRlzZfm4LVPdRqBUst%!Dj|K)hA^(Q|6=iMnoFn+x1cBG z6N!EI`xN-J+poG23K@cL>A3X?T$`MmwmKpBwf98N;w9V~X3;9k9wNa>g@9y(KM z)$qfz0iA%Rnr<$+SP+0~6W$LbBBrW_RyrWV!RM!Z{P$ozhSCQDRu52a)ln|@P2r}R zK=epD)Ts0Aw|66DT98Y6(C>w!&xu*WP993zq_v_26-mm0B7KNj;MwWsT9va7ff{

N?1#z#K31Yc@5g z+#>M{g5UZS6DPMJYN&{ZS2N&?4lS)a4G(sD(l|!=Qxa zAb1Z?znL(9nx))Zn;Y2Qw)GwoRs6>9wa_*Lrr-@Q6b*VN9>~l4&HwZ%({H{`3%w1p z1pyj?I<`6Gh$>#pi%HjUGO^;Vo>a&;Llw+Qh}ZCe9Bg+A8^v4yQ{|-l^~aSa*2M#9 z(`tWW{{p%bULD<-@xq~3VG7W{X*=6=qyrux`GCQPa;~l*k|pA>iTyPMv(u0Lwm(0Y zbrSU#%?F3T&+$!uz2h-H8Tlzy3ir-Ns3?1+)@UxBdjZb{`E(?+dv7*!aqf8=%y2lRsHWzT|m;G>}tb#LM}Gqh= zPy~n9tvVjw^L|9>{wMDR8 z1WQ%&tA?V!wzmcwvycT<(irLzx$z)E=Qc`h1?Q@T2K?RP&!$9}(F z6Nkf1o0iLPH6B4Lr|84pl8}_Ow1Vu(gEN!>u8xt|Ug|gQ$a~MwkK?TSn#lUX<4i3}1Q$sPXk^VZpnvHV=8yCAtl#jpDDRs)t8M$(bqs2(8ZeoOt& zXp*>%I7L=~aNCV*>?eUP|4z>zX(;{Q4^{t7|9G!{_1=M9bEWb4$#I)6^uNN~$!R=zMN;ea{>7jH^-kKFKd#u~{ zy?TFX(T^0OgxG_iRmz*Vl@D)cUr`QNRa1f-TmQUk$LfhHN-7RyW|othE>X_Qg!Y65 zGfL>sYY(1uvJMztXo`o&@x0A$I$A*+*TH^54|Mn4!34?wzb;tA(kO)s?ha2&(5*%KxgwdqdND4d=x9Fs@`NRc;G zVph{+W#|NeqPk?_2u#^H!JqxEtAmJfjsMJYw6)za0r@zFOFZIDWckDCM{wsR*Bto%<7*0531(^ zY%a6JEmO~-<+#2;0~}Zsr?1Qm_0e8VxI$OM4YpA|S(n(|Lr;@nR^nEd2pE<8>Pz#X zfNJ$emsN^$<-p%uCo|KL_Ls~1Mqbx${rT^lFQBDn!HN*KHe|BOCQOc@t@)-z?GyPyG=0Em%i7P;tup@e_U6!+AE&5#V$#ENM=oOi+7FKyS8 z1$_I!86RNTe0s=S2zj~ohquiNdKAk!m%QK93f;oW2Q~|jgq&> zQxEZ#5OoidI0A8j(*tf^718>vk`bc-+Y{$qlDSyPZp(!(6xUVjZy30Qi2_R8#m~;o z5l0}fLDQBrW9^P=W!b_FMgWF6Ivx{zlMj(Kb+w_yJ#EC7MEsuK9pXIG)HB;$UN=vom9_lrLOH`o^+}?a87sHoui50> z3z$0&Mbx7L!(xP9xG{a5pqF!N*hNiysYbiaK8z1ZR} zMY@y$df-*N5Pnc0)gY*`k}^P!(MW?4e}&dl;Z#|he<&=!yZ1+d0L%U&t@3pd`es3( zMa75!*_a~bMO4V%fkKKQ#sN`h^R7h1uTbRQ-+z_zD{Mi0D47;xTz*?Y*MchRuK1Mp zxrXoRqY2!u{2XkH+T-mobgdTK;eqUNfdzC4u#~|rN0?FI?BpT|fvdRyV_rHq8xo`0 zLX566f3@@JMF=39nxJP;@LXP&mkD@ISFUD&M+VBm!N@vk94!v*to@Ht0%bSKc*wtE z2~zATV+!W;EK;T>O{GZiFnpm?4mEYEfRWz@Z%wDYKi@V4jTCDjXLF#(MzTG_HB?g8 zIIuK@leoTF-L57p4+&aI$>|)t}4cP&<2pTAwBhFz*i+HB5Dws#s z0UZ3yMH$5v;%yQ=N?iM=ljn2i#5Qhp#jr|~ilqAktHVDv(#(6iq9Ugk(RhZ(G0S`D zj7L2vOOW!+UNhzyf)z+0&)yuD&uhP3G5YL=@VQa6mtFc3XGkimzWu{2YwMRp2W`1! zfp;sQ-j?u>H&oYLDw7v(KTeMRR~D9d`$lsTDA&m1-r1?_U( z@T-1n7E�F3fE4Ggk6Jo6#dX1J=_{m|XPDSurN17L#9lLG!jN`U4FOd1z}0?yf2W z^tLKb3+a-$`kmW?FE4qZIalvp9rD#5=9Sk!Gl~{q z5f@IZS1$wwgyr;}fV%^UU+_J%P~* ze~wV;!=oN}W>`IYeQ65GIs{)LNt}j&J-0G^o49K-@Jz3#-Sn%Gd$?Rz4>*;F(O6DK<-i# zr^o3o8O#ck8=J(xL z!?rtxzE>650m{6x-A7U4ju9_2kmwuNcisW`+!eSXOk>1Mmmq(KZzzEeGt`~E=bRliJ!@`S+pFTJ z2_EzrdJC|~1*MiQ{Q&^&KtKn^(_p9%y&Pb_;Y0@!xRKz8M2FkLt1n??5D({fTPNar zpFH6OPnS@yRbv-b&dup30ODh%O`~6};biKbl{zFl$o5z0rlc6l|6>9mi)Y%r+B|=) z_$})DW}(&FoZ!#fKR-{+_N)g$>Xu9WmJUMDF_Sxg%r`t5>lbQ|2F60vaknNV*iS#N zW^ud-Im>}RnBu5E^(PU}XU65)<5a%?lt|ReP+|F~oD`+Bl^&E!rG(XWUNzQvyQ!)8 z*@0{I`T7cdcN4CQe(IFr?hQ{(WlY;+skQqJ`Bmn#q0l$?z}3>kl1B6Y`@R|MH)a#A zim(1MuHR$qMj3f?0%%b!V0Wbv7$zIiphDb{tp$)mjyQSlX_)!+TvydQ9`u;)2#-`H z^fsY_2x^}9L!{&nH=6;ffyleqXYFO$ZRm|Xclcqne_b&ToWIQllK^UJ{beb)VDX5n znio@j0?DO^EA1=Zlw)J8;r8c>O)e#QF)ryqs1P@Jwv7qaiw>Ac(IiHtQAULxUN}CS z5UI7Qqi~eux|^q>zvQ2*;ze^G(r6cm(oJk-bt<>KR|Da{iVVVc2`l7G9|C1MhT7D$oj$3 zQq2FA$;(S>@$F4E0~m(jsLxlM*x9GK8yK#=JTw<8?e(Sb$=?ua4Uqb{4Dc-_zh&Un zpaV36n0aoFy@X7y`N@*vb6*hgxydq}Wv`C-mN>+GBg|s2olf5Bw>sUiwS|>h_}l1d z5;M>5L>DOi7hTS{j1I5g3zyuK7GlvqWTX)}rEZdOeBcoW#s0uX;(8bp)d4}9f6hu& zx|VF5oJn%~2yRAJwA(QL2ma0^{)Mf|%LwY|EPRJPWPuBm5EiEi!kIF5)%Y?F%j;3^ zy<%a(#0`tO$o2H5V_sv{r^KKW?C5@ht{Qmr!4;;!`a#<`tOB5P-Q|XK4@J}Z97Pi< z4X9fANfCSQKU_oM^%qVvO~Bam?U8XQMC`yU&l95*hDOu3S6w>_440S*#4Tf+NLyGe5!q07*?!j6mIW^M)GEW? z@=yWgNE6Af>pP1G2APZqB7dtAnH*gL`O~$0=CAxhjZa&Z-T{e2DulI-H4ObaKo#QF zw3_CN{#HC)8@*CvQ@nUTwPc?(n_00YT-;{xb$U9p(O}$i?Z0=c8D*C)YWSX!;G-HJ*de&iPTRxRo$6XLHDtHJ zT@VFkG2)l2Vu%{%k1OO-@_cievBk?V7K~EcRIu8Z;4Zap`0@?+s2%gcz-tohr+AHW`U-Quc9Oeo&lWc8Mbqg&4tJ2ym7-*)W@ zYSPWT`Jn39WeVy*>kCoXy{7w461FStv;6t0a=X)`&ks=7u^sLSL(EtG!vFVaA-HMf z{A350?6>o^-}@MX_>wCYn;P)$@mB%`P@>JnA2KLMoAvCGIMfS)ENkVSOt$rri4PX7{6MDxvWxHBkP~HVi|=%)%wJZh z&BFE#=Nm{_ejnSes?72^e;d5AMg!g&c@lL_)ujhn8&noqnCQhBHvUT#UxwN&Wi2sC zJ@I}uIw}OhT~3SqyQW>5Ksc$FXKIl+;9uK@zaS{yJo`)cp^ZiSS~P}Tr3>Zk#1kWM zu}Esd)iAdBYJ)py5BQ4A=NgjrK*qKFm-_L1KzCeekIViLAEXk~6Swbyr`pOpOM6o) z;%&bysojmQ@pdAdRk{GH%Pi0D%;&vgV-%(G05$%|+`d0`>kl|K!mx0L_LFgjiNl~Fs<>wg zj5E7QW$;)x5XBX(4XHr-;u5e}P-A-ASqvxyHWn@0QzpNqYq3n$FbVk8iU;Sw>lY3x zpy;0Zh5#4BH)bBKQUX(PT!>xt4A+}=rb;MoxJLZr1wd7Hjp|%lPRxUIWlIaf%ZEFS z?Phlr^}t6Q&z;POZ+z-P*G;FN+05wiYdL10%dUvBPRbl5ZeF&*$Z2VoS|s=R0v-H8Ij~ zLLo@**)nw-n`P+MdfbxEWARk~)2z`qdDgiq2jMIvY8EF#&Er?2Y_L$>z~g`1*fCdb z+yF&|M49Udw@V7Hepx+7J$@Gn*J&xyRa%UX@xKScLIK^0@Ers%;n)omBJA^uCtvqK zR-OSXWY6NdWP<{3a;Z+B$TnowRl2xH z+YwRs$U+DFK2#fe!XTq}P_gu=i%*f^jaX$K)%gXc_;0|wz>_pQv|GMGd1K$*<$qKQ zy`(h*RrOb@o{m|}9x0Hm3PY}~b=SxtP3qXXxHhn9^IqJ({3}*DHn}iJrar;#yUjVAm0hXsafvuTvs1uPY!g&l8dfkHABd z$oHNPvRf|f(Avl|MPg%>MW`sLU1Ki+pb@Oybi+s<_NFU^i_iC7Udw}9yi*%%%&9j# zkhEMHa;}@~UiY>tBAzs+cksz7-z(GRMz+o84Xs`&?6-g%^!+!0Mf1+H=}%DPY~&Z2 zRO;?{PW2pu08hy7D@f)v1&-I*(QPa*ATF?{$FJLNy3W7F0errxj|OZVxk&6FA@;K*io~`x^5#7dlNqs~ihD5cX%p_yA|= zscDJD&<=F+=nTF-9%<7HuV}yFi0a&MEhJ{;#iU9_2gR(nzwl? z%5QuFi=hljq%$zUc1Y1l9$$ev+bdoOdv=MuL z>#xPXaurWoN}b<1%m**V^!6$yekkJwCVz%pRZxtm3~)oa&d&RievN%XpL%H;WwB~< zcSkd&qqfsiZUjwy(76BJeT4Us3d}xry)5u-=Z!mmM=xo35q#yX_Y22wG71~Yd80ac zG57AN{ka-UBg=nFLe`pVO18vnrnl0%su_Cj_jhkDx@DM*)9!akONwO(#nP3l%#Usu zkzf0$HYON;EiI={VLmkwBwx@-Qu2Q+Z94m6;oSdarefg`auVcATCg;!i(7TOQqwQd@MjyDBb-8uh59sY)`>L>tF{ zbG~$4)jX+d(vw9Pa`W{9*UT61j{H-edXy3Og9T>4-g3Vuy-tIqR4(CU%zG;tA69;4 zi=pZf0Wj(DJxYx+mGR)j2S5s2K3o5N-`^z(gaC!+=}s5RIQSCR=(f?`Yf` zqGVUn(cF`k(bJ%sUl#C5KZ|BAkQhFgT^^TRn3NHyUXlIduf{p!H*Q{jE4}&Vy_}&7 zUt*jOeBHu0IHmv91gu*@h4bv9pzJU{W>UM*G}D7q;REg`{blkDxAaajT~rqBt5U!0 z2g_>6AFErO#7B;?SGF2MUi@bJTXP)GHzFpex_ZO*iYN8=tQlvsLG}1k9VNxn6mMsp5p^Q-KFLc^hwqmQD4s}FzAgkF!t4z3OtJx56XmX1(Y1j ztH}N(VvIJ>=?A)$st7syBy_+;TCx28LgcVm$@)jaZ>xY5e^ZUZvmrh@F1yFtXb@62 z*|`(*=mj*Vy!oB*)l7!bGZjbXRh^BtH6zWy2O$&Bqt*VY-yvF8QbxnsOfsK6 zPcI;Lu`TOaXOz=9ROHim|7E?R&gnNF*P9o2CGLPD{#xQd^A_#E*9Fc=u~~_?Ei7Hy zGf9fM_r6Fo*WPp#x-x4`MJrjCE=?Gr!VKK0m+f36Y()!NS_NPXzc513nU{=8%XS$w z{>`L=ZpH$?WK$LLMBGk&@4emHu@9zXyy!E1vnJE^Re>fJZl3qfCTjaZ%T`81ke|g| z7t|G1hWndjK+zhS>VGOjo}6*3IXi$2aDEd}3-l}}^rgFt3`0-89e$e@`xVDO3{os4 z6q9fg z6@axM`N%W;F5va@+4UaWot51$m6zim0Ot<$dJl5qvSA%ZGGH;eWY! z)pGh89sj$sjIxG>%jUFf<34!d$L_dc|1U^fY zKaOh`{Ve)PksSR2^;6TITsTlA%#$+q_uh!*xTYF2g!MG1BDt7@d+0K z`pr?H-_)P$ijx0Z0x|E)vpny{$W2Xn>zHIXWFFj0ArqI>X8l5E?#c$;{L^0Pyb)w! zVa_iKiMuN(HAwV;)t*`?HNd?MqgO*$;?1#wuJ}2kE(H*wrm&h5jQqrz$iEnuomnz+T z8}Yx5JR2<~OTZ0|hoX?L*{-+pWH?N07ARnw4EwPbUZX4-=XMTG86Df8-(;M zl{eZFR86X;`cWz_q;645;VNf3S1_F8No;QjCm!&<+24EgwgKLoHkTFW{hjn~{&0_4 zn7gc`!a$V$amH|t!avRr4Alx?ZJ?B?)n4hca3spP<_htBE z^6an^*pzQ^mZ5OMl@2%%gH5?YvHRWRKc~^ca!_cvnAl!t=KCzITN`H)Z?4BnxbmA+ z!aIz|LZj^t9xXpJ^Zi>|x&7M8`uO^g^67x1SEb&@$NmYBi-rm+_{GBjJf% z_gin_1Xrp)j!Nx;Z1@&#Kx-gN@nEJRv=JRTkoBC1sKkAlG~W~EZ6Lyv#7ocY6+S8n zPm~+zaiT}1!65f=QTuzsv?-ZrS!-#9Ip(Wow_lL_SGvh|(^3TVH7j`mXZ)V>$uSqi9G$8TU2HtS1_Fmk z4WEx*WE>f`|JAf;F}o;v&gcA#c*$bMRG(OXfVWw zRW>ePt2=e=gpGmj&C@r0+SlvaSWL$j0&YG^1b0F7Qa@7A?i*x;QT*-dvm1~n*tRp8 zUh?3FuPolZQ_i1lw5XO!a;w{Z94zu&p(mD?YF1#3#c`r4d%fy8_xlO>xznQGv%dJc z=Kp=nMq_@@Tw~5M<=4Ys)Dh>(TI>d6x%Y#VL9bT%9(FzPh>#Ry2Fsf{1`F*ZL_e_B z;{14@7ZLyL)7trIy+^)-kLgloRIX{*K}!5~HR3OGKF8BfOHv;2E=?=J)$p*$6X72Y zt#V$*r%9xXsKY!%Vqc~0;;aL@7Tj;@-c~f2UQyn>zEvikT-N+tYCc1CzvS>MfarG` z>eyOHSfPiTsrrl~lPszIbUXmTLvkyk_ub;w(NP!H1D}c4hwGIR3Q_Nlffe&!Z%n^w z?pmuy`hXD!F!hG5Sxa89tb%aPhg7401u70`V?-;%1k zxD4l73u&-(`)(ZbpUW?bOo>Oye~g%)1@RSd{9c!b^LN5@(@;el)4gT1)E*BRAp8yWBI}Sn|M9s$70Q&Xy1#j$#jC)M|Y;A+z{>lACnfjf$+d9BDx;! z+xqGIz*n^;D$lU{(G=Hqx&Bh<%}lq46N7g9V-|I9lY`?mUyxHAQe&-+*e>5JPBxd^ z*S)&Jg4}#aFP4zqpIXf)G@3`x)VS>ve#*AH+_X%{uDQOxj5M9Ar0^Oc6cU2f}Wl_wpKuFCI$L?+m3R*hu6&~Npl;NF2@=G4e*8G zusryca-zsq#>xQ}<151;I}enq)^n?rPxI)#0fgdJRt ziR;{cBzxr7y8mh9mA9D!zA1lKYeoT$Q4vG$ebad(U9V0p4f_Q1fR=2+^`7(jF8NWJ zfBmC*dZ$_XVBN)U`{WJtL0XxBik)A>0kz{-pKMuXe=3Gj4>dSjma19yfR#kSHllXR zde(E8Sa}V=30>TW^u8&X;!^dU5gItm0h4lGt_8N8(JNSq=(yJOuCFNZTxvf`7=_pc z>KsX>^rju^JX*FRFw6AmouNB`t7=8wWAi7n@Tzr7o($Y0XHr)faVx;Br$GEOgs-pW<+ciYF`dz$U%w|A^F7LB{F#%Stt zwheUe(GX7eE#Nf`QQdcz?(Y{c6dxGM`jA}6U}c>z59fXrB?}8HfHqaUKB5Tkk6m<} z_T#w`*3VNiU(M-Iy4V%^au>eg$e^Q-&rK2KBKVf$Vp0VdG7CR=-C_Lr)>ZG>;KZ%w zz-I|h|2RB9zMXjJ+$*_r9L1opAjaK6h@Crq^tf{EfBW<}8%mxH09zz$kNgLg5lx9l zbQD9YPpDoCn*{5-Eiso+fkc_(N}e$v`y%#=+d;C9q5YBOpO?cLJJfjNiuGsfsHFT4 ze@ym%EPRUnn@8)Va`7%2?eEt3i!dZ``3Oaq5sd;T9Y~GMn<&$%P>cE;+8u)D^4GY9 zgZ9IdCRNk0*n?~21=YMV^22Powa2*qXBpCNu)tmyVk6`vcKAyheom>MqG>uhSzdI% zViX*oPynA0spGqX=U2PER}~7i1Af-kzq3qSrWg9}gsA+ODd4Wk_xO!eN^U!)-&*mS zEViSs9PpC0ChSs0?ZG@skKy2kb8pY z|Hsr-MzyuATck)!f#Oiy-CNw9;_mM55HwII?iMKSUfiAH!QI`9I|O;0bKg1lj*O9? z8QIx8Yt3)kg3@09GKlga?nmphKrn8AhO#yIg)Or^B1n2KZ&mN9N3*x8(t87Pt^th| zctQNDC2N5B-dHq3PEG0BlP?VfcS(z%&TgRS!;c1LlWS!nkVet; z-QYgMUJ}L3um=T>5U#KN7`L~c>+78!OI03gvgA<@>4y_*3v_y^k@l+743}Iuzcuv( z`12@jbqQ2~=s6%;TYibCMsU>VcT8)srhW$ zJY&TZ7S*Z-w=KXmEtD;Fd$15J92)AJjfnWV^jUUK3hQn_@U9cNS6_1SKd6`J29a-! znZcazBXtLWvK$&EPNEz=nUb8g9$KvDlQcuD;JM8zhv215HJ*xj(qV!{q8{WKg?to0 z*eGcqy>72pSt#9gN>>v_V!0lj^A^1{jP$*YuYYzrKg4`D^ZN! zBBh`n_K2qLtU>4<%VjO$nefw7X$)w5?dcA%zm-wH+R;L%vU$9^CF@Ih7mNEUy@Ici^z@&Ts$veRD@ZqX9I<*y&GvD3YVI;Iq=^ zCd9!3WquXkzj~I;4*^#D?4;O`oL?D+?cYEgMbWZ&Ovfa%JUf7ht{HC#p16$js)xK1 z<9sD+|4AQAdX6V7bzI+W)Fem7TQ(%Do`Ud;T<~N2{1dExwaDkh3+8>e%tli_S`0h> zyy*H~%5^^(R|bhzI~+_&{AP?ntB~l7hUF4|MAr%b@`H^@l-1?#pO=tmu?ykg1Ci5&9X4xQVhJoQ0G@tr;k$AUsyGg5W?EjS6^WO)W3zDHAx z^~G2mVg>cRxUJShu(zWVhKDeVIikNev6Irhl#wo*`ECBI9_`qM@0T%ZzmwU@Og5v# zsrki-2D|^CuMOXwA4F=9;?WYs{7#7MjUAaqFsjN9FzD*|gXaEA^7pXCnjfnH*6a@5QPc*a%(Gh+G(s4 zlUUa^J?82K&jo=PM6|cUswS|>6_~{xb3#e6*3^p>9*#5)As5n1Kk@1p9b8?S2dOGOn4qxul zNvc%|+W#pX3HN{z!Cx;p9!Yhl?08=pAal8^XHeY%ob#?R|xMzma0vo_P_TzF0yO;98CtJ zu)=SNnc>?jwpHVfa%4>ne-r0bUD;qM=~2-tm2xQ%Yv_UMIduh9dUd{#7*7|NhoxG*A=jn5tDw!NYdx32!a5DZF-1~%;~{?P-@ zxgxtveB-MXZ!37(v;gKk9nN;D zWO~2EB;y!79XYRUMI<2O;1wnAr{AIbx}U5ob@=V?56?FGIg?u)vwvXy=x}Qx7F}n1d|zPiy_6tK#2$80yic{0=P$}iR24VfTrmwu1S=m^55{2 zP8PMNcXA5<-I9_w#64qXfM$5;euEi(RX?kYxe@7nwDGx==Q`vpkfU$)QTSDSyyeq51a$;|Wo9qL^AQ5gnFQKEycsr#)f^ zU7G-WW}Hw_oPryk-%<8A{GoAemlM(-KQ=ohUoO#7oD*~pj5h#l2tyjeKEmH z8^&Q1TT_D`@k`h7VZ`}mx3;dv1ts2)kaau27?#L)t=IsHK;uG%Xv8S zHJ$qo5{jw4Mbl{7jl7OV%`5-IuacyH5hM_;>ui13p`U>JGOhD&%wz5LpcNFe_{qdD z0~e2Lr-fDVKCr=0-XJVyhuoNTep`y>Q^icQ9I#-&ph;Az&03Dzr0{L5GV~{EF~J}D z?RD;7K=09kW*fCIr%>3jJ|#&tyshvOBL7Hbg*^zfSm$)Nw+!~~xWBy=?0jn7J*3Z6 z%k=0552I$@w6R(FG~O=*uwgN^TJ`qJ^ zD)vVa8jNYX8Z~crR5p`yShn7Z5Ka(Kq>uPbScxy91oC1ap4|0*lmP#=erUfVT1Nv! zGBbRj4{+<{b|7Ff$#c@cG%_Zm_Z+3BK=%27K7*_A-h9etZsD`{A_s7B$9a?8Jn1S+ zpf=rYD3T5O?5j^zFE0XT1$Xv*rrprh%MI6=0WkZ#pHyI#Ce4b9u3yRWjN4SO8<%aX zgh4GpFE`z>ai3KDV!%+dg4~ebQb|Rk&$;BQOSnpi+2dtCaawO#YJ?{@^@d0HSy@2{ zc7VI^MNVJkw|)6xU2kglDV~LQA{FRBylg^G#pL{uto+ z?_W){wts_A0F0#J$YkC=tV8B2iQZck(u2+U%bbY|DQnyI6CumDHgbs%{zB+)fm5E3 za<*@R+&kK@AwPo%w+o>edcjK-cW@fCK0A1XAV#OS_cwKwe3L8IGwN8`U1~UoWhV$K zZYUpx+4`s0sqbhZ-#A#}agYx=E#9Fc$hp9WyVK2Zd~q$-^}d_kUGo0Lq;lccM?dB% z?78;9Ob=psh1R9$&Cdpnr2yqOi*%>RZ^L!#f=h0RcO3`u zbB|%%6He(V=#>12poGxC#B{5Cz~X$zCIsp--!?Kdj7i4*?a+5`xuQgv)~j@chD@SY z&3HZXQ!ppi(f}92!TVw2MMchu@9u6x zS8xx)Vdqg%N!ZVgl|v#A8>nkT)BT4}>-!KB@Vm^b7~%*Qpe~Y7=4IGchQh7ugvo%- zNyVxPaxyVr<5|b&yFfQz2h|~s->j@FG!5(MSW!w2OK^QkA-|{x6F!{gvu?QTU(5d? zOtyPg_4Mw|H(RqQHAyLBF?i|m+#Sx+RK>1LnX)L^{jF(f#)v}ZvD#F&;<=sad^Xw& z_G361>%ABi*0PKJG=wmqFDPcwDq*;r3*Y`RnVe;3=&RY|0-Hw|C?l)ZQY1BM{CaU4 zJcGAAJd=9QlJ)g8-%tF#33W#M6-XU)f`4Ir=eMq!aCeQ_J{aiXL2~TY88IZSL&(4F zy>^wk8teD_;Om#6zt(>20H7xt;7{86llJuy00)zJn-@K#Pv=aLA_{Rkzqy2DI%S-A zFG$8#VloBxi!pcXP?v3@a-gQ3L8IGO%A_XCp?s%=;qKoE#ibUrCq3>BRjfKWRICOw zQ2Ywgy?{tht>pFCq`Z6~#^FmXDjFN&)tK_Iq!BvDv9+OW1~p~H+pV~RGW!?JhZRO* zdKGFpX5h67Pz7MIHI(nLdN*5R{p`_eefD@;krgF5iMqW15$Zh(3uu2cPu@pNNR+qC zFj4zIswaRTBhJDyeEjA>YGdEx1xvFm1%GV}9R<(s-2mDA%;}WPaNd zW;V9<-i%2-Zm(I8+3PYL_$?ixVB-16bwiFRz<{UW=?5u0i|f1{wVvi26DIJw6Xmo1dg#iV{~>`#IFu!7QW_Kf^Q?0M>l2&$ z)j{OVQ-Te$=x`NI<+xg?w7ZKI-A%UfNY?qasBhoySF~n>8{Ff!kSJ~Yr9|R1cmL(H zERk)7@1yLSlij#VE{mN>|B?r0@?~ za@l)4eOp&xRCS`^>d!7QwT%mL@dmaq+!Wg%s+|_Ervbc}>z=dA*JHg{S7SX#<1!!C z>jCee*W0{J9*BqnJNAB!)56aZohb71CMwmHoaU0f(R{ausCq&9daRpD3k^k>L_bJ4 zG5#V06`BzFNHdkWlCJ!|BfUhaz5AS~;JB7`Kk7ju@Mkw-*u|i|X{1}cbu%o6dHo_o zkLzq*$-cu~arw!ldYj`!vd7N-(iiWU&V9JHSy9O z0**3RQ~%Xz?edp6Ss(69fK%#2Bvzad80Gc|=0m0Rvw)HO9Fn55C^2?{F_4IbBg<%^ z`=ug13{@jyOD_afV{0`rq#C_W06=>DNkF#Fk50NwO2ywP+0Y;my!xXz63RQ2?d66r zrwev;v*VzIYZCCEt^I9tA4BA0Vx~ZGXSwL*c1kAcjj*G$?hj|9d-EJE;i4L!7s;z< z)YwI?R^;NbHYn)0$uW{(>Mi^OLX@9FeoCLRu9L*w$$SzN z4C`L0;OR9(n=@I3WS>pP643r6Pb!}ALKnB(8nl@bt6-05(!Jf0A0FfaRW`oosp%ZN z5832M8oUTyx{z>*2U-n9;WSq*T{oWP8!~*N<~II<^TECbEBm*t5wIn(5q6#kb3v8B zf`eu9vm`9ZSNjs9T;6qU9LZIq&DO|sa-6vjuC*H}Oww`8XSvaRs|_ggur}Xdle9aN z)&S+=*sp3tLU%oX->;m@5y22BAzK%E*(^hSl>RyrQQZZ8Pyv76O}PG6W9TV`=etEe z+=M8b3Axf1S`yUS4XOJ1MJ4LhAKpgg74CK>W}tLC#`z^WKOimOOd+U&y8w~TM{NG;MIAcV(zYpLZqbnSeqQUprEc_ZV; z)4~m?B%Gah&d$3!e%~kUDEgon*V9y@v^(Iahi=g+4c?vfBhZUq_=}8QONZ24cb39q zeQBn9UHs%57n?s4bvt8LQSxs6W9#QjPsd4UOom()9PrW-KGyPol z{AbP4R2&RRSwpHqFcrl#kd8F91^46fAB@F~8IUx@7ESNN_iD3$>^m_bhx7BjHf3g7C$4mX* zhcE%&fTVjHpIW)4LqAOl`GhG9W3-nGr`;>&temTtq^8h8UQ`8+Ng^EAi{{tv8ea_c z&^33d{Rh7N`DS4HEAbMrZpV1|r*IHGe@xJNwAOyW_P)Rm@B!Sn@*v0CEJEXA+TUWY znp{_IVTq58{DWtq$IU6!zGg}0qL57V3OzFyR2|5U0vA&trtYasD` zLVseGANX4vy;HY8We3J)!kK~2X_Jvg!M^{N&?Qvld-snN4^xc>l>8e9<2zQ{U^s;= zC8jo*GI67V16qL7Q6MD|1ILO>c6q0_!J^|Cw9hT*1Yq!cZ56kQpsi+ntcO|Rd*4CZ zusf%e6B(KMql5ZoiR|QrDD)2yCRRQdu3ZuFA9m?|ej-Qr;|6-62zSp*L@4drBt^2ZX zlIv1BRzDlZW@SRP8(aJsu)eyV?KNA$3|m#6_{61QS+h=e$TW(>7JpbP zL?j$3p(N-=Uw0uzfGM>-o#5LakMgMa2d(!}xyu5KKah`R4DN$?PNI<^$8|on=!=QD z=Wuv>(|c8Gnw4`6R{u}y0&L08n_6R2HYd1g=z5c(=7dPMJ_%8tM~&)<$V^bia0~@L zP*&>b>tDNo;fYAsd|qEJOHj+{*B_tMbwdM5;_uDaj@~h2BOFgqZs%3WeasJt;<(sE z7R3>8;ZP6HEEz~CczTDwrgRUb9=iAN66}2oy1D18x;0!3zz;#$zObPi?U0hIK&30N z!Il+>=YuYdEMVpGYla(DsoCOuxv)tnB<+YIBDBAOFoqu&EQ z$Y@{U<1k95PCKDp9BMAy#M4`V@LUvpaJG_f5Qf|N&N@9EnjL1>YOHSj+O*|pKH!(I z+u}w37Jwvn1fW^k0(m;~pEKCWVj^H2uWdT)sdI2{fHTn@Kgk3KW`)dEsuE=VtIBX0y>k}PzK|Fc?LAb^l@D38Wj_r~_?WMVNNnV8E#!ML z2bmc|W~M0(W4qU!(Ftd-PBxo0$;^?=S|AezT!*?|=4M{Kl zV$j#zts&0T_~o-pRzA#k*=@>s%GGw0rc3FCpnu18a}|4 zg^JiSm*_J?X7#_W6QPJMCvuW5XnQW|cQ?Wm7X{1$=@Ja1`3`(a`PXM?9JT^vKQ&Ot73eG2EM4t0g*>a!S?ulSB= zfN5VMQ>}cV;+wf4UllBg@kX3EeNp0#j=VEE8O-*p+H_5Gh^QCep&G%l~TG2__O`m5juL?KXBV#6h{O$;R zc19K@_~v$Qh}r{`pgWLjc_~1<_K+Ge&@%`nO+8nJo+s@cdM=L_W5H$2am{zG#HqE?Lab z?nu^sAo4ubQ(UR`nh=0U`%xS^XKR*y;DPKZu?SPx+>U=Mj$oB{I&!Q$1pcqD90OW3 z*vaI}{&QGr$T>>S-SdDBxMKbU6PMDQQhf*}5_yZbn167%AtIBz?CE@*f%Z*}e+<>r z^oFcC^N+o`lX@CzydfKUv2_E$O`sZc-A9HKdm3%$J=63%g_8XjB&Y3(i%hb&Uo0d7 zx2fXALJ09sN?@^|tKe4RJR`iUqz?B;L~gsRA4|xX_XIz(VJkNwtIRs?JTF_ zq2(IRe3ttI%mt?l*zPHRCHh zru3zzdQ;vZTktD6DH$J<)W)U`%WT-N##&a4`2NUpGZ$BXH@?jRh9d!j?+m{GyI{OU zk|Me+#~@Lj@Lj#1_u4)^1g!U9gw6M1gtZf6EdI)u4gfEqcV?H`^qWkNr|9WFMu6Y2 zUC}L{TO22y9%MWXe4}AE+e4R_=R>ufS6%gLQg|E~SMHrWrSWH>vF;-PQq5%YqPvF9kn=b$o~Z{3b+_vTwM`H#MCJ9lp`2Mv6OVrM z#@?9fiWm<`S0B)>*Sahs?SVkAmsVyRYbpy0KFnJlzt*%no;=d(x;`xPKrT5JTqZng zGHwTq6q+|KwRWfWNBdie%#*{KAaCq3LV%nmvi0;4tTvqW)#pn1`rQ}N7Q;cB1p&ef z!y*B9@onNCM{1Qoe(Rg8Q9PW!`41G8XD}b}{P6zJg#(9=G*zN9i#;kT{xLZ~_+f&O zUbmuPoU$}UpP(PBLcBh)Pa_)Rj8qYZ)+AK8nhGj0!HQ+$8t>UizT z#Ak6>Nu+X{MPC#4SBBubmz!{6irz{**Xf|)92tF9A-<4@=#BKUY-CZg3CtOCLsDI! zWg6`MC-5XG#3j=3P9hn$7EwLmCI3T$YUt=hcixXPIaBnG?`ii8wkV&MgUV+dV#%cs z>s$(xG&(M>o#zrPC`$Hh&Q^3fo+jnqVjwHpDBDySOlYt7hv#ZB%+vM@MT8xt$5Z=b z-4^azKHu+{3-$F$bb*|255fv@nUI6NN4D*<;~)#8s*=HY!TYyrrn%BhWf7pjP;kU-UTFXW8w>98^Lue=>Vh`Z_4@!@EI=*^tu3VRBF zyt;IZCZ(nvdnP`Tlj1(s2Jm|52940;=&}9@iebGn`=#Br+u*C&Yi6M3G2g)!)Jpud zYcspQ)V7+e2HuSyO01kszGgf+$76(U6*@n~EgXT`EtVK*Y{z7K!yA+AS0ZXf269{- zD`TSjj{1L-HMpVv6G58q=#+lDnIz*PbCO~ZWY2O7)!{bgeviEGS3NAQoc6}dqHI~` z#C?oa%Hns#-byaYw8Y}~{YKS5EqZNy-&SyiF!D`J$Q+^SONtqlof@igTN-{`P5xce z6>RI=b^&<^{b?Ok(h`zTU|HEE0}wh>^E#f;Z5> z$g}n<^*YK?TX?EXdPLa$=Pq6*<42QDFE7vj7$&YgrEQ&#>O7y*%2Q?!pofAsrUd-) z``61hK|4BxJJq)SW9RaB&x!lvv_%;%$E(pLv7B@j?a1^(>otw#tu6*yftSf{A*C5@ z_N2D(5;pp13CNpH6P6wfk0ye}dfj1KuyrgS^CdTI=K@j$x1SVOea1I5wYnmBZg;@b8Y{yMq|-Oz@5r4N$#4K$RB*ZF?odf*2(4 zlul5nhOCMDzEULpD1IWIU@ztrf4szua^SJWERG}>2HxFDp3v-mLITF66pxc&$vv?5r>^k zJwPv!9H~UGG@taMWHN%QGGg$I1?FzRu_zI+B;iEHB1_(>0Mb}VRm(4ww#UfdBfS_x z)grrkJA11}m2tA^|0J0q-4at(U+^CV=dbr|u?;kyGaMr5w)2h3sxpUF8u{TA=Sg-8 z(0to&B%96J#&l?-uZ_jS&Z~Argil8-jV}zJ&6Fp50P8ukp>|Xo;J%#LKr!>Ojr%Pc z6G!~I`{OrnN4w1a^W91vPNiI47U5WpZC!o)OLEG{47Fm-UgyVwcGnsST5({Gu$ywU(-ZV0mi22YJ$+|#yIc}w!)6onZT7-`t zFXf@Z?S!u;{ZxS-j#F&AK^h1cm&RS^Bvpn(JC{ffyh!xi$ZJV}ZH3R3WvrQLj6dFm^i^4icQN^*@ z>mfPD0H;pESPLo)ohCwPKD(Mg@TbhXJqbTQd-!sZLz`^O>?M zR>QPJk~mV3o#1%|4EfT`r(w-e4zAd_lD~`}kDxmFrAyzB>N>rFPZ?t!sv7z$-as-9 zz_0f;{T3>=Kt-KL6PL+ghTNi#YQA#t>^r2o?pY%W{!7mpC}7z?@WtmASS@R##1lE!B#mZ&=_h zy1;cbK}bKS*VYls|Fc~*?>iwELTFkOe(hJ~qjXw3_4Y-7z7UG_7(gF*4}|k{9MASPdRkAk6?kGLCwAT@=nPlPUy&JK zi=MWk)>EGoR=D|3&vY4%hx5eGwbEF|1`hDYRG7wdF1N^wEtD%IF^w&HI8zgYry}J5 z^x@*!(i6$91CdjQpLsgV3WS%QeJ@6vRI-UGucG2G?f> z2r-@&_Y93U=#rw``fIs%+snWB{Z_ zl#KtpaEYLE7@2e5+pY}fD$<_+N|3faQW0Y3!&A%)dxPB?WWtBv3lfHzJD=NXT+Qxw zNHjuTu3xn@1YSAu>-=dwG0I9(Qn*rf@T4TcZ(~&w=;@Eyt`9>M58p*_zJs5&O!H~2 zPJJkyTdB%a2(pVYHM{Dgd%OnMFZfGoMLLRJWT_tWmlVmQoL;R*D{j^J;uAE)EEDqoieO8PKjPTqx zBo(D`2{}b=+Sv{DXYsgA1g^a)oy5T3;Q=00x>rMTyJxSa_3B~rYXtsZ;=b$}MU;;F z4qsoEa#qs35daJd&b1c%iVwqrwsiA8#x9HXZZtaxH$uqh&w+ued-`;sWdKs^;IY>D z>oEd8AgR8+FwpMw`J?e?We65`R^wGJ=iF0u2ACl&cF$g0k zsY9s4?Tqpc{@F`6M9qgDe4kP$1dnBmy!4nN^%5R2Gx7nqnMS72lN~#G2!jd)E9&=w zbXFzCO_EAWiW2ttNFHYAJNF}WYF*_DV~K>F6{r~}hqSP^5c!fN)_ta@!Igx|G&;fK zn{{6B3oqvUnI`>D7NXBybfy(A#nLywm2U%0If{74u6T2wx37UI9qRvhjxEt}X<_<( zw??GX?_lo+Hu!z}HLd@QL1>wKVX%?zg0{1viqNP3^87#SzWS|o$%);qwzT@3H=Z%! zpDt^7D*21{uXgwx8BM#Ek3C%)@K@-*eBiTX}u@pauT#Nn(lt6+ArtX`&K@y*>Yb%Y@Ec`M}AsPU(bul zj-EHP4A(a)cEZKh?BF~wJ2oa8*w^Z7Fv6E@sn}#@7_y(;MU3z+;XbYthS|`!dz=9y zD(%@D71a6C-U@E)s1lcWge_*vAzAkddJkxOzM@}5z4x93;=^>W^SdGls3 z^&qc8kj-dA{ji!Z;4O7!OYX4GspD3))1-C@H3v2vT0QIBxq^y)N}U(Aw+NI|H3~n; zP4_FtJGtd2M6`b#6y#y>+^~#UyX&&s$B*C+I`M8uUYy?hc7ncA062s7(Ei>;d7Mk~RS~uNXDv8JI|^ zgzmhAbvJp$e^-rs7!Ei`V}Qs;G@Nw|%G3rsDK8<1qeUkF(;Se_0`r{~Dum@n3all1 zzeqSh4P)uZ3o#(X7K197;9Zo`qes~dA#}*n`qEM06F~-n4~x7?t#7w z!;KFw&%5ofn{zc69nXbU`OOQBChI*^u8i8OB~O3W`HC3ySqqM~$e5ngwn|Zd#UO=E z?yw?2oT}mtoTXq>JBECBP5TjEtpr;Og~y>t7Kw@OyTSo17Rs_CFq!!|dS+sC&~>^8 z#wPsc(qX#{+ zLk)(=b@M+8^n7j5yeVxVoOWPDH|lWnYEJt`4C$o z#DId*{O-EM0C8?P~9-b?I?(^L5rEL@N=>9dNrP)y@(czi8R(i75UpSW>l$S zz_~8DBo5TW|I%EARp&x&P6Hvg_fz zXZPz#xx{eLRm%K&OqJ{Hu&DR)5;LFpwed`ja{-P^dhxW)z`QEXevDd|3?qe6@uc;G zGqu7HPopDO50H%cA%p(c7%8nr_|U)C36_<-K3^ zCp2Vly(H0OmgHfU2FE8mpG^!+$9(5t`$95!K8c`(ND#%gK+m465`1FzJh6hs!O&Q5 zXnh*$G*G*>C7u!@K}FtWQQ^P7LzsaBjnh>=Gh2XYr&}V-8}&Q$e6BOfzfK%OCN`gsd!%L?#(L#m+{y}+sCqf_Yi10`RZ{pa+U$HoPl^gF<;4R?spc!qP-rEM}%2 z?dRAg*6`{$ualuwO&-6lNB6qv1Oj!XV!|8_rH7q^GcHWolqC#EKh9c@a% z(ZN%yu(yox$?$Cn&>mdI@z8jrTs-fDufqDreJT+NMaobe*2i~(DPKBNjIJn&T@Wq| zU56E-4BZr}gY!Z%_w7JWcBOq=(eqA6BWbp*>N`7YBz_7Dk9IJ8WK@7#@s)k={OesU zcsQa(T%-7p$(f$cFUZGC`^ZG+BM`@&FmE7#j<^b^0bt9^EvcV-DuD6yib4t5(R+qIJRlsZ(Nm3;`%Bg3APt!%oD~aroR}+ zgDrQ0k_ENqt8iGIm%6c_NM6Rn=L}vC!-ky=bO+0g?Qd@)h@a;nb0*W*m6e9(XozU8;Nyvu)8z&Dc&1B{5cTyQs@kaBe!xtlfAm!4`U1{0+XV;U*l z+*m-E8wpDJH9^e#Wr0n0s?n_|XH80Fb=w4AEBINT8hM_uxU~(`%fD6uQ}mk3=|sdpfH0fMgywzTIEAPzK=j!7r88K#{TnLKvP@)HEn;E z7sJDzU-RW)eKqoq@>CE$#!UU*47CUC;fu{n(51t=lfazxL8jD>H@e`p;3-pU3#VGc7+Uc1Wt*s;^4cM5YV!u#KP4*LTLWb#FC4sow~x6$?6ldxX=) z5&g=CpX$pjRRVJ-KEiqL$PuZDgk*B%d{36Z`b%d}HNt1=y`ynDyXnZ_t%U!C0Jpdu zB+Ba)>Kzg-92ky((PR><&enS}~+&CSpUsdXqV15OH9) zpQkplUvQ2c5vHRg2|^Saw?QZ?d$OJ=%uhva2;8Rp@fD_q_<_0^S3(xGC{UZ7m@2gB zjkl7?VlIMO`E3mg*C?O)CI&kqL&v}Gm?Z>#j}`!jy2a&$%M21}>Q9jpxBNyii>}KH z|2@<2kGo_b3aXmSNsbyV82bWg98RQP&?w$9c)@f9Zv)!DfGIiDH;H)%UfnCxyJcgN zuZy#X^!fwNw8;ZTN*UYIWZ`UfT#+x>l^tF>U%p7~Qdw){KOo|Bho@!X~T6 zC(lqswTys3jT?UeE`oRN*A=1|GxJ|Jt*G{QJBl@--Pb++(Ux&EicBGT!pNWaHzJ_) zBK_k#&wHVCobogs@EziGe9Uk@X-HXZtVT0(M4J|vZ1ao@9rQYISU#tt27PpTbf7 zSok94U6)rLAoCfZbsOgYS!_Go?QYhnF)${1L3vlpe1vAHk)COpd~qp7CvbPsvAiwO z==WUpHRH~r9LW16M8YMeds~B~?w=so1exP^#7H>xb2M|~_zP4iiO6n)G1wqLaCzxa zTYxZjQS2_A6k6jWSC|LQt-9CV53ZUI6FpRJgZc*)b3=7_ybxQ951vM}Z%!$cV$Y^$ zIui?TTqb%fos)!TkfeQb6PAn2{&}92gK+Wr7C zaCsCfUz3%*tmQN7EkRK&Ryw22e`m%}sOqm!?>Z^bIngVH#yK#FuG_Mjko?)lHtHUXy@k>lb05qPBw28sr~`mUK}U5VHQ;6+rjR{!1OIshnb3~n{U_Qbz{x> zM9?7_=#Ca_CD_s|%wBrW5i177f*=^2N!*x;eeN@f3!~=5Y(x_Nuf3ZrdE8Ee8 z+jk;_1z{HnnmT!Ka^QZ!KFzWnl<`uQvt`%*(`F3l>TC z_^_!w4@KPpJeOfA{mBMT4*Q8=2~TQg3qDm(7isEA75FGi%;%OqL!w@Um*_FjlD@LW z6fqb>RuS%QLUNuDWS|jIv_9&fI4ynTnz49>YUnlw@XzCrtl73_Rg9+i#)L+unk#oZ zs#FgpH)qrGGCsgEVK`dmzi6C*6Q=jWZ;a}E6O+`GVljqDiM_(lgSt2_1MBn!{S&Hl z_U)X~X0%Mb1pL zCOUPp7=b9NRevdpRWa@1@47-C|7|$XDAPFLB6s*&0qAG2$%7#4$r=qPU_+k3eihO8 zM_Gz_KDu-^Kg$SfO96~h6MxF`sjtm=g}n?*Wz*qYv{?M+xm9+YCfAXp36amy&&5lH zNp+6Q+SS9RU!EeCthX+{A}0!%Otj^-8ZC`n?Dh$+x9c245WlrBLT=q@^V;pJe&|KT zPB4-i_qF1Hwn5QDrEj(9`A>(hE;@@X7yj_^+{#2>k77Mzgs{KTmqpgcsppU`1hs*Lc9_{yZ^JL z%X7eV6+OXa+{e3Uipt2p1TgLdj`gyYaW?9_6NgoYJQ6L`R}&EQY*|SqP|MRIS$Mgb z8q*5O?s@z$d+g%abN{GW+Dg~Q^tpN3?*(c=JzR#q3sTcC`H%`ewpTm+4P8=~SH(l$N^$fQl)J;pc$V2uyPN`;UGz#)|&JUE-k^Mi7 z8gIpSZww&+8EQdql}7u;$QPy4$J4RPRMZMJ-`*>~Tzdcd-yGW~!$?J-H!rc%tjlc3 zDYLg<66(K36(?L$lTe9(s z4@%t;wCfZz0Q*G(X#l`cBF1|S41xrzbO;KGt}T5zR@>174N%Y(x(& zfj=$9S?47aC!5TgQwywnYqBXWPw{ZCN%H1cCxvhzyiAa$PGot_Vlr$=a_=jK>kTS< zN+_Ehm0$$R2lx^M-pOis{F}9X^UOA(ecG$SY7+U#`iSQe%3I{T1{_Lq0oT+P4$Z~= zmINC-zho#TevaE-=bCL6W%!eIH@!x`4v^?;^42)%zX|+`4Rw~?=2kfE`$}v0%B#}= zJofC|teXcuNP9Lj$jyid7;v(13ny^g5_N`o&U^YFV!j#1jk4%Nkywjj* zcRGH5PXqXW?7h`nT-)+BjJvx#G){ovZowTw(8eWLaQEQuNpK79F2M=zZb6&IT^oDZ z=j^?I=Rf#vzRPtppS9MkS#wm4s!{uFAdspbx-^q`R+bSB`GGT{t4jnr=^V~cT@c+% zqKe<=$q!NenN)J~uUe75{IL~UW}0#Gbyw=(4S&$%`GhI3r`_$@V{~ENpH6W-D09tR zjFIl~XYG$BZ;F+)dkfvMI%UH?jge$l%`LljDW^}ldX0Z`%Es?tp0E6yu*4$Np~zmC zsBtIE=fz8I`ze#^#uhUz+D=_CQ`|fre?=~53wYIy8CWcHfYyq~Sy|Z6%V*?XGd8-~ z$p!}Gi$05i*fQG6UayC7X0lGc*AJJ44bvhW`k+Ls;@Kp3bgy5U7f>AaqRA6EN|xm+ zHOU5P%nZh^`nch;AXZwHpF~sd#-&=>Di-{urN`ga5=%8OeO#E8MoWbdw^zDSB+vs; zJ^d3RqnPg81F9drUdGj0Z?-D&z1blZ#2)eqRO>>N8nIA$#AS$MQw`_|rb|`zGtT;L zn(bLa4eC?nz6y*;;uYmD(S7eOPcG+#t}qH(xV)}4(n=A89HE9T*!vGK%h1#Akx>6g zRfb66AG>m(kBolxrSSoMH9Rz_t6~i4yR;Jf`KTK2VX~R z_@LqosZ#Gd=#=RSQGYV~6btTTw^k*ZRne!|S3};NX{(DApP*!z47)5jgmP!RX#p?`{pUv=Sf#I z;}iYAVhOo2#=A(afhNAt-TeYw`Z3SlfLi!_HTCLm-eC4@t%*+aj~_>^UQyx&0hGIy zqvMg)sl@Oz_pRGSs4Ne^tLv5eIzWun>G+IZ}Pg9DTd^~wK z*{u1;J&C0f1G2Hz{K#)W!Hv#@WRo(#=qi$Vd_)Jns3KLvZ(mlO+eklaZoC|p?Vg;= zeiOMCR)K5bc1Elcc#t#Oo8DX(y)(c3JQYOizL(NgZ?UBH#*@nU|wLSB#Bi zC-Q(N3})gU*)4qm1uWi5fqqvzNF+bg#v^95g3KlZDx>VAD28n60o7sq(FQ#`lQZ(I zTfVt1)ng#LrLzxiw;Ydqg3rkwrP=~~O~mkZ^s?2II0KfRuS51fZfYj(KE%Rn8=9K^ zZ#fh;^fm$~Q*tdQ07r;7SxHgTP4w%iY=fDvqI2OY7^!fqu#zMX zs|ffjP-sFVTrCCQ$~w|WYa_Co8d(j<5oUAzKg>-HBdU5b@iN(DO(?nNl- zd@7pE)@Q3|HS^H*0aGwS`>JDJ3iDMd(IH}3PGmfD`2NluxonJo43}-eD z&I%FUqHGny~MLNZI$Z(u8an(nW~mPgMhxWxbA%NnDME z?`BSQqB5$M%OuJZySJc=%(k;o1R{7o=Q18OxGW5GY6d}c{9Jst%!DaQ%&)~Q^f64+ zH2<7-t6bARm&xL^N%%kM8b!UgW};8Bp_%s*C!8=Ho%~*p(fGTISP$+)98{VtX*ZTLarKy^>%qIYo2Ytd z-)Aq0RD4<|H29~CR8JOEP!oD{%3|l);D|mDvhmj1{7gpL=RVS33JO(y;q<$uTmg1A z@9E$Bwy!nZu7YmS`O?|iFB456<{f0qqOk~ZGmM_YY#lnM{!?E@W_b>G4U@p^{y3t9 zsnO|Tl?HWB2NruN%jO~sA~m*BUV~PDK6W}S&VMF7k9_HAg2dztiw|6VHB!RIEw8#n zB6+qrj=9jFg7KQeJOqRyNXj;q=KYUyW*jMWF1E2W5xy`hs$K+lF1;v4LGL;37~M{* z>cP89AK)s9LP-w-#c@XtL{-Q~?^ojfW>6pKmb63Ab%i&oeqk%X)F{_vF}+*X1BT{+ z1LaV&f%^!88F0Y0Jil3It)0ypxiJx+dM1pHJ|Y=vrEeV} z=W|DdLuVLq>bBN;hx$+}5weSIa06^vV-eDvUJ*K1MAQHcSZ^DTu|Vvu3Nz@>C9+eL zZrL!Q94@Hnl#S#&<5qJYEb2~+F{rfUUJuHgM@KbKq6Y*u(NB_#R}P0YDOi8hL=a*wS-uD$3$Q|03p!t2-of>^4!R|5AUR6cpk8 z<+b>;&f@OpW%op^#Zflm7ug-7N*cfO^B`xaj$N>@$;?+KilEGjv?cQIT(pFN6YR>-p*zhY9ho<4(i_@3N|1)Z(meHbRY5V!vNDo?@0 zr;1QE2#sS#UPd+xN%FZ;Pczt?R>~{R#sBAK(}P2x{jz=avI$>;WTb&--1iW44*W8| zHC~r$6cbwE;m+m?|uDZ(#NGvD~4H&^aLO7E?KBm0u$O*Gn z4AUKQu~W|_d*4LOmlh@h{rMVrxk>aVz^FN*zZkAa=Kh#}*s4j9{i=adH1uic);^ha zLHSNSSkwm{bqmH%C^NOJ9$$t2uM}*l^wHOjb(IN`_qXcu#$qy;P$t76aMEYfe`W`Q zv@tIzLWQZ9+kHxo|AYg6U173VVeJY@v=`!~JhuD38Z!DrIVk3d z%o5-y|I73zbZZW|8hwKsY)XfpmjDC%9j(DBW6ijfLV!~HaSsr7{wn)N#kikU5vAYi z8M*LW(ArXfe(cL?h`IIu1w3!X+zH9%K{PFO6Pb}jbH%L`E$|&0q(Lk-IvUhMRG8Ui zviwC0&d=+MDURzd%3A{+=^{7tATPp>lFZsoJ6?)pPtNmeFRMcrr5#$OPa&weiyM!P zmqq$w+MV@~j5`s{*F4#*+z&UCZ1?A_Xtze$82@U)wI3ub_ zTsBL;Cffgve5$h9`9r7;gI!Jhl+)}tvqwATdn}IRVmH3^)8FlwSBcC`pdR_lnk0xd zmCbcLtYxpX0zbK6#D>N`DMB(P9!aNZ14n6jGIceXRh$;cy8JLt?<#S0hW&duFFkpg z_bqYC)cSH>SW2<7rw%Bj%PJ>!yQ)o);_yuoGV9fb<&pM`4&lQAbK^=9=eW^s4?HP`qwqS1;svT7DYcXKEdB@t)L^!mRJ83E2lOlh~LTYzTM5UH| zVXEw(6n)6Ouc!4}a0Mly-)-LUt4 zr{qvQMWx#xta||m$>I?3^So%Sy7NR)`?ker?k33yczwCnpf&&L$gf8~!mHaHpz}|- zn@{zM=^}Y_rA*t$ed3JuzyXjC567C`&K17b^j_S>hRfC2A%V+l=c_8^0hM34{^Q6Q z6fj5nf`anMLrPbNMRL~&6yAsNV|gY{YVK)GO1yVB;2VN?x2)dbuDWVX=YHWlajEbY zcgNX2E1TEBI9FoI@tXM_U#R*=N|>k6U@y&zN1ZD#Bc&F=4gfdnHuh zo$k|5^jS96@W5M3Aa&oZqrny%#JAyUC#aqCo zN1!Fy37$gL$bew8{>xqxm&Zy6m;Gf7m)}fGuMiO>>qYJUUxH{Sk4opeDl!}oVYz+cuz!5~?7?Vx|1aVDR#Hji!~7H0kr@O28$29wskqRoSC>f% zxA}gu!P{3=bL09ebm`B$P`NDr#JTDD0CKC(*l+ed8s~-~oDJX%>j)&VxJ~`632?76dyS_yS%*`TI*5S@4q5eP11`DbvqKXI(R~k5cc$83 zdYjTz*#6^@2afpHmMUE);lmM0Y((6Z;(pC0?FAj-lw0l^FSXbEY+A02A(P?E^zlB~ zimS0B#vw)^Hhmx>4X0P_P@c<`O}y0hK-nuHwHyrLw;LgURQ2j)Y&t9sNt}t(D)*tr zwQy%R(V-ZY3P0Aw{w7sqS89kcMci~~F2$^C>2n$Vjd$R{y7>Vs~|^vwTw zz6;uJmMDCe80p`8M#M5(=|sxSy}25qo^oK}o>s0ce5W!~cU}#IoQA==A2_QCij5?m zh&z4|^ZHh)>^fr#F?SetRuv9Sz=NNPZ}s$6fz&;8!W|hIlMlu*dpHIqPBoaqMywHi z!A5b<%}MQ#Ys{hUgsog0hV*N)dX;))N{|9iUOFME>|qyAkUT@|1*>2rQEjq&s!O(6 z-md-s+#KgfP(pAHKXL6N_wj$r#a;Om#BzL~-qIYx>AF1=(1_b)$f&(g>G^A*$6F~1 z(rQdz5>f@KAq?MV3V|Dga{n7JR_l-=P&vD~oKj73HR<4C1mo824zx_Aie8&A?s6`! zJw;wX!bX~ibLb}KrZQownw>NsP~W=anuP2%B4kN7@I*znSgrrMk)W^p)P!r zrJ;u7knsWI)k=ZmFflOX%vW-1UE0%L)dgs^c;F~EwpRF zIaY^C#}aNwp%Ev^cmj$xnWwyIy5a}PBXgrACi$693~BI&acXB_jrYCyA3Y`56T_>aFk! z4HHyH;r!cif|ymx;WBJ^MJzk!Q*%sP2A0C>=hp+bebd_iy+mX-w}j6CozIZyE~9fQ zXdDODmHB7uLC6=+GNPXZX3X?m*B+!JjXAyLGE`r_DFU=AENnS?a^K>!p}Hw-QK@+sO_j62RR64 zWGQX@f<;VLNK9g;6=G7QNcsL=SQkU~O+r=^Lw&jMqsGe%+2$I z8nM&|oury>1^iE9O0tysppktUu+6db`fKeak?b#iw5Y$Mro|$dlL=Il>L=4>V0d zogrLyMkY*N9FGU60+o|ROI&K3^=|mn3HOd=pEMXDTF(G-{F~JeAZ|8+DyF4>%V`OM z5@{1Wi$4Zp2lCKvUl1W1pzR5C@$N`{xRT-*a@G!4Q0`W9O ztiC-HeqAP55P&(Djpt#KqOX;r&f$;iT|zaR=`_!DxHsCkJ2@#Q-!re(hNL{;$IIAj zjKmHAg`a#4&TRa2JZ_)G`8Nv#E|yF`jYfj)``E!BSc(p49IjZ{yrkWNtC%^%lrWM;BJ3yKii;6R4L_GCqI{CpawGw#7Om-^yYg%*UG2G zo8b2~14j}5kuO=9_1lJ(pYSl;r2K%lmMCR&=k^m}F>6;S7TP))4o`MqvcRkq16@xw zwRSFlp4?Vzyz4CZ#(c9G_gy1Zd&nuPEj$c?njO3~x)xSIk_;23>-#WNbBaRmU_65P zP~70AUC%w@V#rhiZs@{p3wU_btx!dM=>{B;iKO>4cq!ik09L4Cts5~uRchy)Z7KOi$z-HqL_n4v=9Q;w(=ZLe=~|{BhpxSu<&;IQKn-%e7F9hnXPcS2<63+_3X{$`lu)>~(a9txIau5m3k6?Fi%qe$7@kSVgdg4ya+WIpC?sak zcIFveHXl@Q-m3!~Li|D~@MsJS$#xV#lDz+mD~yP#hOvRuB*<)tq~@ zo5p-%XN$naLk9pRVj*$4G!}c;i`z%$RJ;5X<25W`MBOi-!YXGPT6~T^uJ4y!xg5?W zubq_VMYM6cC_{yezgQ5J1^u^Cry(9whOL@cdHecmTMO!WTsqQ-o0o>4118y6NH*wKs8kE*h|+e1OK?j)X2` z2kU$P-RFVDke4Fv#a~D1egz^^jLfrzaT_8`a&g?7y!tAd7UtuU*p8t|D|_L2hjv&B z_eP4c1!g#$jUiD-zs~QlyzrZ}ITPy4|7%85j4;>qUp{TW&LMLWQurqlk4!A`gK6}Q zFDCuP4lND_?^Vr1!M@pTbbJUaZtT_8O55-9ltmaUX~3wxu9S7*KatFnpWja^c}o*b6$Z9Ot;rJqi2-5ZyE?Ez^iJlJ4oY~2rF3Awp! zA}bS!kzSt-((`_DcS}TnR5<^lM9h6+`lRH2^2O70KpGLIla;MwKX;>Mk3SQ-YosIAs|nyr@7E#e{9Wk<3XxXK3zt)`Cc~ExnbAu`_Y_yJ3$k@RATTx zVZ8=qBAwugiH~=J!ObS#-c)Dlyy#wLgf2+7=}>NJicdpfP!+SBYhcHtH?v^G$L&D# zdg-@QiQ&P<;!}4rFL8;UxJtoF2_!+j7R9AOCmZ&>!uszG!wT9veax~f^%K+YA4K?l zP~}=G9w7e;V1@ALq_ka<91@P=Un?Fz+K{_T1+ZQo58i1{sScM?4C2%2u$(vSLh^F2 zIzk0cykV_Pr(*{>-R$7K0Qx0TDmONAu{Niq^ru_xCLi$-gDQR?NmndM!m;KqNp_D! zwrFL}CG*q+sr%KGD-UIfY;4R{g$8vM08#0s4DkfX${2wyEkTyOI>bUaSeN_J1j2LEX1hSe>*)fw%O|wNy3bPc(I27+u3ul0Ho8fE@pDXI zJKcyKRu;c;Gj~8sV5D1_=Ok$Pb0$d1en}(iH!!|6Vk77W)FI8^y-poid*z8zY=c6A z$L~t80uj&}vlJ6ZEvWTm^$NQ_L&t`!vV9JLHBjx}HFggdq)EtDnpSN_~Vz77bP{o`#op?UWA?5lW81Rgey}{k2Rw+g_&`vSP8w z^%en9z7HsLgz8*Hr-K|k9AFL_bM>-!VjjroCy{7G6F(LKnmG3>&1b6mtp9V8pk6{w zm7WtIj^N15pDrGUK^!s4XJNte}iMl0J@#2jrMtUa7^J`x=Q72hfP)JI-D)Dx{eSDdAj5 z&yl9o&ZN7nX~9v0zexw5Xx(nFq*vDs+?h4w!J|F?ZAy%h;-h!Z*J2Yk^6WC;YMib@ z(XmlZTrtp`0dYaz+t6|_WmX_68o^5ct3)o<5&CqPOIecQ_c$!+)u(Ftl@8Xgq2sE> zXLjXm7Z)?Y9=O#8Ll+XKpBfM%@zNJJ{(O#!^@Db&61Iw_{=tw@QHw&>I?Rv!tzVDy z8x0?jS5Yd(yJ4a#p(^tfTA&7ysS#`RV~(IRGv!_aImkA=sR+{=X+~i;a`+{ptxDsB zh-Y@>ulo?H^8uNe4$l7gcBL&b8#!?)$uF>esV?B+>=r?V2}+#HEp`kp^euW@FHVVA zIKnOdv64f`4IyD_2=&`Q+;2$`{wwb0f3yG^U}05)-4lf4D!!5m1Im&rsO1rFs_b(9 zgERhujKpwt-z%<6&PlH=CIAwjo^mubC;|R#PJC5ZkayZ9(X$frFG9NBJd5G34F1a3 zH}ZZ5z(vZ=voDO+i?uBuIcUj+L_h$u#45j6vS`PI%q+9t5J-K~@V9v=IuzgAGw)4< zIYNN2J*G2G_xn%*0KfY8{B9Z%v!OpDq!=UpM|Y)(E7YqJv@E zxGR?j4}QW0FxxpPKb=2nU&wElZstg{o~ugK4q4`&#Xvsp&w@WQUsscXNmHv|bPe<2 zn5mh0&5hypCxU@ubk9OLWrk&)N+IrZU$_F!W@Vr)o?JBDpXt2)Tj2e;P+nHYIV&f{ z3zBi&Qc8i}f>`iZ@#G(^ssDnA)W$^v&p%;ePjh#tqhUX)uvg~+urSSmmPVhnu5xby zMbda$cjZ2kGjp2xV?60of zd>{%WjpQmsrp!hKHRPCykTs{_3Y0N?kn(wl(0Mgx1ob_ttTRsMzJjqY14p=U+U5{J z`bL0)JXsSNEms*-IF72o7x_u!{Lmq5yWImaKyIB3`qyYsfB2Pg1HH!GYKTR%RI+++C(Am?JCl(aR|I!8K1wMAvR zY83jLxC*k9hc9TWTHF*8C|9dypR4PL>>babBc@ZN-Vj37g1s8(o%7>SzG}zV*U{tX zZeXT93#0Djn^O;aqG+cWSP6>qdZ{GhjSJ4MNT}Cq|Bd<3g2IqI)3=^bo{%!XVbRU! z9P|oZNKIjj9azk>lwS0QkpwQ9s+Ze&p!zJPA9AX?ZcQh>>`kw||K2)GaBZ#i8!u+MR{F!Bf>0ZQlQ8pPOD|{8!7G%5 zl7F_ADekJ8IVt>f`DkdkX#%5J*Dwy0smy<(EVLjTqy~$Pvn-rn*uHW1j2j^>iYWuY z+Dhrk-h5IioK|thTKX3ix_+^dY(0>OKG#8)vA8e09bjWnjyfmv%#~cRYxC%yyt(E~ z7MA3fX-~&hSHe+?(7*{A4=%ywUg81>o{6s3MUR8l0!UZ_g;!wc zOF^Ey>p8sN%9i{w!J=vTl%F#-^36ciExazDZ}uD)%t?OffTqujo{kt(?-#FvPkJIgO zTR|>=-!Ee;VyPt`%L1x@t{8m~y3C@cmA%GC)3%%Hy6c zG<*!`W#OE-g(y^`?L?dsWB*^AM}j`*+mMH|QkXwU0J$)l zUsX00ALAmSQ&<-nXlJ=e^od1TJVUd~xKbxwIG40y-+)^9pDx%7jJtxS{v#By% z_!CS3>iDd#ub0Cm1E3=!iyJw(cXQdkr^!pei-&sFU=SHo0~VLV&bBp=OepSa{-D*i zsa95M*mpS)+w%Tt@vjRJfSXIaH}H*xa90=jt6xpwc^!g>bcpxvIqa$9F@E^EX;+PN zW&z!KzpAb>Ww>@vP|hGNA{_TE7dF%nb}|jr3ix0VPz*BLb0HOjA-O!*lI=T$@zY0| z{mHlMn}i&)q=A7zqvw6yipM zRWCw`ic1h-6O1zjEk>g4!2&Ytcd6H~hT0yY?OLyMbDS;0(^iCkEKRCr4qcO8Iz*4i zC?mc*A|$)3B{OhjTrNuiit0tbog4jV1BL4Snj1txRZ9=a_K!>jv5Bq# zns6@G)=Xh#VTrG!FbdB8NXfjd+c(jsHXe1RxOGV-@w{u?2_4qz>|FlPDt?T0)smO? z+0^za)1AI5sR=s5{#NlPh2~E+OoFDW%%KiNT2smDk)k9~5Dzz^e9mGH0oh!Ld3$G8 zgu7g7u*#>~EPkI`n}5?0u+V4f{mm@{@1A0Tb5U(5f$8^T@6`&In$;7=B-4g`CGsO z2d<&Yl8F4~n?ilnE6&nTg6|+BH|RNjieH;Ngfa*N&UyH!bi)&o0J@m0&E28HS_;$Y zXt|!{KktP{o%=`98G>_90Koy98I(iP>fUfRonvZMq^R7@!A>D7@74A!%8AOywonWg zl6>L2XQi1B1#5RzE>M zjKyv&7GaBKr|Etuu)<$VJ(%k#lI)sGWtYw=GPaj6tX36hR>89Ik>u>DcY{Y|Y{F*&<~$Wm zYNMno&K2HsrgkbWWVFusG3D*_dRnOE2RQ1Ut__9E(3rUz6rcQ7uVJCpxi`T6V; zvh8ggeXF{bsW1}-UE0?6N?TV# zchWnDvELx4l4FnvSQL7%14an6Kb5kO)`kE!4g?c}#Rzr9h?syn5vF}uM!|#sRB&7P(gAuwL49%hrsYuieLj@J0q72LLc?OBv zZ{--lCC$S5HmSvfaUOSw_}PCJzDnmP*(716M#K8?GUh;zCG5)c4+(Fi$Zx@etjtxc zv~Z%P;lBmMS8`)0ix-AdM5h^GX2hc3pMJ`pM0pW%+h7=Xc*$2Jm4T>8yvt)#{MSX| zBAx4GXK{oQ;sVdsu;+1rtP~UT{eJQVR|3~ADmkK~jb$Q$4+1aYWaOkQ@|OmaAH~X^ zlg8;tIw@1tHIFqOuhs!O5Eu!N#n=y?xD3xe1DMI|I`3>{SeI)5nylrrvvjF{F* zWKStcW?29{7H>T6JBtz9?*`Kz9@zZ|qPw0PGsSE<9i5pa`A3jN%f(+pdD8|&=_pjH z5ZU%PU5?lUuSj}AEKFlT*-qc%l3^O-WT|eHwH8zr~LjtqweE6?50-Kr_?MRFw{KG+0G!DGx2q7o~_RSH(r zjxj|W&NV8&lQz2e@+@Se2R!!nI&9xP{ygsdU)&5WmCFRz-{l#w{e<(rL!V_|P!;qm zrG@22QAJi?tH78Fv?3ii6WMt$Qw<(}qgpI1;l;qr`Q<13-4COZIe8sNgZ5ay97CBL zmWB->56R#KQr6a8Ugkf{Tv6qQdq(6 zY?r&Uk7k276m~^-&!I0_Z&RWCF7`|#o}(#?WW?U>X_%)U;Oz?u@TrUl`AuNrGmwjw zH-I94annOIuJ{NR;bcCeZiVnJ#g0XQq`LyezWQ!hqaU}39@iHkEwN0p$yCI2 zWHR!5-{igt9jSaMrW*V_4b75t>gg_XNA$iQBppZ(n3xSwT5*wib_E9uQGc>b67{+q z`b1PRhbuq015eFD&oLU6ECVooBf$ifRtgF4s9h}8wK5HFS;A1uXbdXO%!^3p!!`QB zDf0w_s-$=d^z$y?>eb{r%vr-0qMxiWZraG*c+US^a)@CNyVG5e8#?Rh{k# zKQ|3K&pFNew{ctW$rXjlD5oJ1tXNJ=a>|%8r$lvJJFx8^-6x9t7H^ehVz)HEfd@@b zgSg}`RIN-xCL2X)u{&Vlk{`a|>X#$h#!$aBGR&yCo>T`I71>1d5@NC)1zTIg4(D#n z#`l&saTEo`s<89z-s`OXU+PSOdTPNh0M-vexsiA;0O7QNgUzLQ*tSa4?7!#_>B(vJ z6C=+a3Tlk(z+7>VBC*-6?pi}|Q3Ef8l8qb7+XKv1YS$U@3@ zzT?WEMOl{lE@=!XdyD|GH6q|LO3_TDGqXhg&|nZj%1``gNB&o)gWQ3sazBxkV8{9P zL8g+dLl{#xfmRRG>SJvnLPoT+yxk@029Z~b-A`qm!6ahmI<&OT5@I=L*v)`vT~*`7 z0wXH5zJP_OJCx2HpHH(us*AN0T%|Xm4RB zmDlnQL#9R&MCkwUo6VZ~|KK}XP%KPP)7hh2x!&iEczyRefJLT~`^ehe2t#9kCuNwc z;;3KEv1w=sNl4V@5bu(GkW8?UX><5b^&z@P|Hb&#oOVMI{JM7ugXqG0@|Rh4;rY2# zO7GjwWYck83z!yv+0EN5hDxG3VJqC z)rJc6*RCt!bsYEo4^vfTR{ecwv61Zs8p4}IeV1bO zkNCq4AY`G#i?Z?42HyXE*b)@>Cm>9e!IF;GlMWTI6Z(aXw}Hv6=WE-e{KeTom%e5x zDO?+ZWZ5EY$LGla5o=&hH0gHc0=O$Y_P^wagmHHS=PRj2ehw4a1OH2JuK@SiTpQ?! z7Y2>SQb^k00_{)k`?)-nci{JkiH`*sxduQCy48)X02^np7#R zR?#T#dTyteX?{w>4&y&#I#Tc~r2i#48c<=@?p$80haHZYaE{zN@x#*LK@yIPW9Ee7$lVIfz^sNtn!uSCXxEGk6RmBrTo4#0QjL8&mx_Wom_t0S_0rgiIoNIXr zUi4F2G=3F}k1pMm`(8&rP1F-MeyXx|+ zqQ)vt+$lr~8#M0K~;6>`L4$nd@>Ka~be$E5diM2TTldTvb3l^3)yKPS9WvOsM+Rg9XK$Peoyc!jQ ztmVs0cIHr6=WO}B0>LeZl=rKr{Y?hEFPwF&5^MeDM8dx}40x++Lio-1HsM{Y{tWWw z_zQixUuw?_z}n?4AF+r>c(q!w{yW<(o`FRKdxF4s+g%RL2BWLjg*|1weQ!+Sk>`si z=Wq}2%Tk4iRB@!rxBw;fOKJ?Tbp8BLo!db?Gy{nh7yLHV#c`%o7!o-c!Z$Vxvr8(u zf(34%eloPfcnhv-5@~8caRu!b+xv?C5XVK(A|6bH`d&Ype}x5YsO7J3y!k6-SfyJR zl@-x{ObKAeHLelu1?@rV!RZMlHnlzU54A|+okxAjL=qpsr27=NkEWF-f~ z0Lcrum?T7sS)hbtFp*LP0w)zWyt&P@G!?nh6Vxm}(eP_cAI_Gf_6*esXfiGKf6}DkMaLrP7J8pqep{MR9w^pRx zefTQu6GK%zMSr~8Q?unz3HGv`Lzfa>ykw27E}1Om9`{9G^+eV~c5~v1nE5URwng3d zUj_W$fQeo3ude*l6%U}7uUD!6(2np!n~w|H=4?-y6moSa6_(+UmSz=mOjn{25tJDjJJ zZFr73w$D^}?~JnecDy?Nh>}(q4oz6p3(@)nf%uc38AtjtO$_?Z?>3X8(KVVxyT<&= z^I0`ceDFxA%+daHT=hbs0&=-qYs0x5|B#)saZY)PmMko?>33lnE4?Z2AN15XN`B`g z_ivQ@Mr7d2Zf*w!LU&TRw9-w7jWW28L&eDMDi|xCB~mlrww;WH$HNr&al|4#^$6re zJVAxLk9d-mzzk~1?bie10Nd9mXFm=BVb)Q-k+j$^cJJ{bqSe`}5QBz%$gkldf~Gtq zOh|&FSWTrYaV@gH*eVPiL;ZQl%@SXIQwiM*Ok`* zksg~hLo6SU^dLJ$#CBx3b)wp5`lwJi8N9f72ekQ2|gcm{m0ln=s z^=XAP_K6e?&K}wuzCRWje1%q`#momtwU1SvZ~QxS&3&uzC}8DdNjevax-6ggvd0%( z8xD3}SLe!ID%JG2W*AW^Hb|+Y3>V)GLXz}Pbz?_vVeB5%UFN?s>e})->GV{2PJ-@h ze}a~%p@k~HfC)TbD|lUC7)C@td|zW*eTCKi2=u)Jrsu!SZU8{G zy0Oh13|pN+#G^*uhxX2pTk>V(OTJA-SY3Og5et9#9)Og|)Aq&7{Y($jzL}ggGN}5? zZtLl4=R0G$vz^(XA*>8L3)k(pWjsRGkx@`wp2QG(7SV!zyFM6S9%}>*e_=hi)W6#E zo3p?F1jozW7w7|Lr)u;L;G(U^UO{{ABMei!e%bo8TE1cQ47AsOXN7P>vM3|21KMHq zmmW>~*Xcqd;DUZrTm}RhK}{3RV7fS}|hD`c_z!FNB!JdZTY#*^H#wjkW2h0#6 zO5>4W>kKZRkU!Alu!g957|iM3c|rbxKCk2wWUI2dUi2_0%B0B`xUa4>m$*SqtXvy$-S20WYZ~|=mb0>q`7tWsbPdf z_FDx^8K|{hLy>s)a@%8?cE^>9>|ys{yowSAmq{FGA^wKX%?XUK`R2LxfV#h#@SXXU z+a7XB-MeNav-sYUa(Q<}MX^>N5eu(>lU0gF)n=l7gmU}SlKj;Xlz}=}kEY%b zGSr=ZUAd|0jTGkQj??Sw{gO%Slb@nP(b;^)HzlBZG_>&n7@ey_ZYB|3W3k<*meXl` z8{?ExSz3CKdGf~t9@aj{L1VYP>wq`rKvMYNo(-Rb-|o5xt4%0HiZXf$qkw13uWS^& zV@5EM<(0t|RXbeK%V?h6kIW^rqz0H6?CQ7ueVxIkfb`)7hG$|6YKEVQ-k$ z8<=YC@?E_;$kDlXcBuzSoL{HByBlk%1q4-SC2O_D2~b>{mvQ#*NjJ2T`Y=%gL4Q(f z6Sa#nMxER9LxXsfD_kb98OfD8P=vQ(freZsu%~^Upu3^2z0nh%_?H?FSnHVPj0vJo z=1}*ouCRyUfu05q8u_uT2z3v9o(ZW`sTsI3dbZr}UWf55dLD<}HmoOwmv}BPC;B%r zFqxGPl9e7zM6vJ@7>EPSAXs?ptbqK9kSB@+1l$c70j1(xXU`#VFDz>Y>q0R1(lyOK zG8TvAk0!|=#C0eODpkav!3<2!*(RpqU);Kf@_hNMaY|;cym~Kl7o+hlJZpXM3b_~w zib&=>>l{v6M-#()21QFY5DyPlSAP_}nXnCTYK@nqD#+g!EFsHsmx%2L{o-roZqAMjfI229ULOEw6G-fJHtWhmd+oct#*Y&VA_tuA9Sj&0>&@-8v( zoJp+0{Y>KvGYbjpX(Q7xwsr67z`fy?@5`8W`NvzmcUF6QNJ->WK~i$mxx8qjM{ zjlN_7&^;v%s2@9;N}qyj^dh<1(TTV|dsHryxeFD$=qaJP?3BT?vl4z{AXMNtNJVU9~EsJ)Vc&R!4h1&4P zv3R|C*u3B<+1NDGtAgD~1PXfer4TZ2+wxB58D-2-PkEd@qs;#s_cuAR^TRvy>-I=v zP5pM*-T+KGXLU=1vp?;8P3nr$eUb(lT{z!5l_&=h zV`S!b)`>YHv#wk`*EGtp)sqXf4-m@Rdt`R)ukjlCm-eM_>^J zS6D0-eR-|@rN6nEC)#-P4Ne5*0rQ0^v_4M+eM%l!m@wn`l#NcZJYTMoN+xopLXnANfTK_0!r0C`*C&gO z2j<=W$g2(X27w5|9ZU%&#NfEZq{k(k?}E&Srx@ECIi6Sd0_cSYRCu0FHq35c$A3Z^ z-2WR$xx+EnY!_`LYo%A`oJJ>6Tc^y`9tu}2o^KgwzW+h>mhN<+{ABbzgpWCLPBH*Czw)e#8R0vSiHB>Cpr8u45@Y?)X4JdBIBkHPS& zeu4jwy|)aDvRea%X%JAlTNIE+Qffd&1f&F{OO)=88B(M{q`N^Hq;o)Gq)R#m7`lhf znKN&=_kQ>H@B4SIvwsa-&pfm4b+5Z?Eia^mIu3a}RoBwug}8+&ooq~gkHHagSV}D! zaxu7x%w_Jqo7?dm$^iz?Jb90h%E}=Y zB8fAfdywXs@m9Pi<&ZmF>V)+E9IxjJJPGA0Ns|6pNLKf&DdCZD5rF2_9tG=0Xjd9Z zk)kUtz2?d1*!hfhKxN{gC|9^@g@tVlnTVX8B4oNN4pbv6;J5~Khxvt%F`!H6Dw?&s z2r`w^L&v94&1-$Bf4UtrIw*H7Sqzkev$aKcfIp`~)W06ys^Y>obmz@SeBp-c|IRZy zC#R~|_6`y{7sOci3rLGx|!sa;fpX`q4YN!iLH{0kdp(EHR^JB;lLm!mZQ&{gl zHzDRTc*7+F#=QGNk##=#oXf?i)+=@=WgNidmg%@3t0x}A>3ThoZDyp&hyEm5px+OR z0e{?;1%I;rDQQ#m9Uli^|7tKX$oKxW1lMcHSJJEny#UniU{ZRee-?SsJ;S&Qi9twa zn!^hH(d&|^02j%;{n#{EhltNIb980PxzIeN!g=k2oI%_V&==W9Mcd}Bcz5x~#HZfw zh;-f42)TRB&F!5JnK>`_fj}w@9T-VZGuG1uj(9~K{g)$FFVf4^{0ho&t~yrCc%S=6 z+E5Ql8Ii2Rx-PkX$_36^mQAsAxkW8GYKl0wzNOy;mlH0#eo2ft7CU)>k!3JQ^%(I` zaO3RxkH}-Gug(PcO2)v|3~VMaViuSV!1k0vYqh2;k(Yv7pEerAgKRrO$3!1cSNX(& zR^;`re=v%C61Z!6L@(HtYd=}}fL^-f8NzV#cNE+*R0dlIg1xsbo6=LI(!}PlC%bWz zJs{iM047>@RE;WWRrFzZzEqt}azVNiyw+$$0`9*#U`naLFvKje=qV!ll65cja5tV| zYhZ9I=3Nr=bpoACp3IxdfJWqPC`A?<>on-ph2s!YZ)-l82LnXgEq0F#b(2#3+wGV` z{~^$!BJ}p@F{^Ai1yhw3JW9$zNwAkSR5$rm-gk$emS#-_Ct~P#`ztq(d~pL2u-(BW zbOxN}EQ+t3Ln|)8FDk`h z0~hCE24Ke%>=cAk1zf!bF=3Y`jl%b1%Il6E$;V% z@GMLhCFqeUvm;u6ccs)@rOnQWHD;&)-)-wwf?|ySvo6si>d^?U7$)U(NT=StV>9(7 z%5L!H89LaYn$h3{|}JTbf8Y5a=^t^am3`3czCH1D2Q@obGJV^aB%4?KKgdQ~;ni&{%m%^~^;b zlxLHN=;}=mfS`}$NM8S-n;WY>*&GHco~4{vy@_OqVm)aJ zTg9p7SeZ`Wc2L54^jN1wEx0Ddpde8{9j5Rm@}!|-w`O1$I-e_T?1yD*5Uo3`H2))J z8OT$kaAqicnc3&6uY>fIJAE=U{{gX=U`SH7fZHhtZjWe&;Wb;#=j4eQ|IWLYzgRv| zo1ZIfkCa>p`FbZhO2^IYWPGjlBmwD3qzvF0qrYyn7(>Y1OR>N(YD9twZsE)a&x)|0 zn#Kn7ZDQbD_$xo|eG+~A99Xrj`5u?5g`ok;)QdsC%iD2ayoy5rk zL<4b0*|Iw`r!}WgM7C37I8VoYJ~!#T8|k!C5;48bfh_oxlGf2et%*JNpc`dpeB5~k2i^3DAlBATY@A6_w1u}6UznFd^-#h9bC zAJQujR6~?=@(a<}dslkr07e%a3=dX;!i=MQhG~Y&@D~Y|MoWH|$z8;!X(i)TZcDk( z1Q8`}LoI7Qgxx&)x?Jx~7M6e6=!Z$hFxl%y=8USoTkabPkUi4q7HI2veEJFdhN;ex zcKyv`V0-g@d5{Ek{$RaC^nu~*J>v$_k0bKN-$~FOn0;ToNynj*eysk6!pQF<&Yje_ z#u>rp2lHhKM)`Ladr#>iW%2soX_?nRUtN7r)cL#I%u)cOFG|YN$oP30dMz}leS2O- z9-(i{o8Y9X)t~hl(Nx_Ao+G?KB5~r#*_z9jm=9_^aP~3hi1Lez?~pXa@pL{vX(A;l zOmu^qID$($PX6$=23MCfQ>%F7O!Cyke7ht8s0vt@(-dOoJ$W1k0nqOa0LQH?$FYV)% zyy5g)PucD0&LJK_nM{sUPjxHqY-%G(%@8looF`3EeUcHe_p>fpjQRFNpoQ-&Ex6Qe4Nm~}I*)FCv%^767pWAntCtXW)8xe~z}> z?1%_uPaX#8rJ;1`(P{_S&vsWVNWwW#td(qtK@#ms~*s{arx1$HFQ%JZKZ&hUSUezM+@I z3lWj36f+vG7FZWNHsg~sCvh@R@3t&bgtoJma*2fbd~})3BzVd+ID90*s+5mJY>s_2 zQI$1;PxY&e@es0w>yR_3`rb?UTJ~`uQ%`-u<@CZiWp9YQ!`MtyLDr1+?>>`YG|&`F z0P)>IV|GOkDu#Rky70-#sb%6t%E)i|=+|6q>NFOaf3baJ$^KZo`j$-$wr{QN|fTvZ#x7OCwbpU)x(74Peq42082Oedz(sp!bjXOB1~3kKMLYqZZo; zE1{yRZ(yr)Wz5mAR`9#Vdg8{2F_yA`rHJJ5TzN+9${I?QXrH~2AHw`=38ir>`~K{q ztQun>w#eKH^+!$9lqq0GbR1FeLOOIvVj;a&J716 zgrM5CNjxit{nz9=;A9C>r@yS7C7%a}_j;G1(tfm(!=6;OeK>f~uuIij#Z#Jf*Y8Zz z&OETU@vX8s={V2W+RL9#uk8+$n`!1R9;>8j4-UGO7*K1iWo~87pSmd1n46IBc^PLr ztJ6CvQ{^vmVVC;H@vc_hmL0Eh929*V_&aZ)_o>6_i+Pni850L*-GwUdfu~uef#TtS zVqaaaHj@5xCayBt{sVl7X2>qdeT%fkR8ttG5o)-RoAshKe50$+T88ldxIQs!Pt*?xIexv#8g2tq!`N7Qy5lb2z z85i|a(S_?zgc`TNjjjawJhdOucpolz$55FSFETMZ?BT>(_|8JgVbj#A>MCqKKW8Ve zVQQ`!6TPkHGHtInI$$#C%OXpVGSq{fR$=3hzb2)1wWs@8{X z07w_}YJ<*^70a<-;D&!Dt`xT3gKMrWN3|x+pwBHbw2}Gu7m4y_nA<2FQ|E3pTn%TD zP|C!T4|9CgE<(y}rqdLvLqg zG|7|24QeN9rs(!3jx(-RYSKJ9r?b4r_hx~4fp2^rVDuo>9k0J2-1H``0883*sc8!t zY(m&7DERQ3#|L;phZs`D6@NXH3S&u12g@5bKa48hG+QM*AsZY-Ewpg2n}CqvQ{jkJ zPFO2S_>UC`|0Vq4EdIt)6BN3=pZ}EbCF6bT<%!OTmw@t{OCI&YDCc{-*!SLB zNd#H$zSZ;ZOs62UWbOy!?=a{NqI^18TthXZ89dV`tN^T+G&|NiQ5cXRR50JzL7K3e zof-V#{c?QRE*@j$kOG5g&9l4uh{0xZwS@wdUrRh}=^R%9vIjJUnf$6ZPATg8MEz6MKSd5s?bQ0I*G1CH{ua#V83;jFad=)rKi zP3DG}qYixBLq4>kS>~RMqg5aOxRusS3=~_619jE?1mFyzXRLUc_JYYWBH6?8SpT+46vWqXsyt` zoY5zuov+a-Bo(dB{jn?Q^fIfT{QkF@TfLc?B#KtvJ0}BUznMRhi=k(Qq(%f;B~S5c zK{co(s9|k|7m~&7)pFmEgEd3tTWIcjT`Zq51(NOD;kgODVa@Eq-KBbR-&RYvxW|R! z1t=bVC0@@FU8&T6b!o)&;%eSg(do;Sutf){>Pxnho|wIba=YIdA|bkfI1B~px(i=5 zKCKTvj%KRu4ejv;J|~TpD)xIhw^C|`VJg>wNhoFhYys)Q^s^B)LG8sb^9lkrfUxGxjSHmsaBZC2vmw;H3n+UgHtg0hPjBUTW|+E-;Khu?|2+Ynqv_7-cm z`T}f69HHoa{N=BLZTiwM%smIO_VQ;)M95$^rC*{`E6aVA&Rj5(n~!`b*EbdK6?jTE znftpsfyDd$UiZ1a6qbA@pSZpJ=BNu(i|U*lO3~d@Z}h=l?n?hpUE9q(+<2o|+6)pAZk_L*)~j zh$~qxWLGlZ7`Dr&N1XSd=6!xbW52WbdaPdim~IyNnC0*x>Al0$++gmwBK-2ggcAIN2Exj} zgeoMz2fMonOmKLUgfG33Cs{QhQj`l49c9bleW`j(^XEC<(WCgk8>P13DAStJX^wrVych+0F*z}SPbzQ5>>3?1vU3Ss&_ z&$=%~BbIn*=laS?4dB>L{ukk_%WmT*6QA!pyC)W#&SRj^gcW6T9KpONRe;ADu}YNp z2_pkV37&?0Kja9%cyXS_@fkqC7GW}jUgdupLH z0x#Gwhkz;RPF+NwSXI$!BO2S~oiDbVp)0#GgQ1Sl&6xg?=6liB8cA%kwO16>ucb)^ zc@}Q5HOPX(xZb_Y8fiW5w_dMqHJ_Q1H#3#tZnByo<>n8_b$(?{&7;&m{*LUK5B)4 zpsAfGsqMNerdyvZv}UT8({tFa1ffpx3E9z#-Mi+*(@*x21X2cMJ^UNvVbHaKY+B-p z5aym(zYu5;HNfN=J=E`}MJ8PpF#2*7!CZJD8}qvOR$hLF8>)|6XVO-y@+gyD*!K}( z^5WXSP@jDeagdd_?5dm`a&&0SA&M~Q1tGHlUXN=adtz5NrY*Upi<-megX|a?(>2=3 z!I;ajm#aM+Oh%t^HydOCI9h?dp3mRKdp>8xNmcJQyx?p#@nsOA>n4la<{X7(C+Tiy zzl3zaf~oNBrR#AGi8vEHJD*8d>I5F&V>XKSl%1pNj_@cxW#{+PDq-o_#rs#rxuZ8q z2Atsz#R+)G+x~bGaz$6SkPiF^+CLqhRRQ=%aq}V*W(|t?AWjIH$)4RB1BlRT&&fs= zGhIhogO?(&@eq??^0G?g7Gx3;n^M;%Lq`H3Ypa8NW9=H>erhMfKdojFQ>Ud5RfI}- zRQLv&ys(ExvJb=;KQ+MING6|J)w8!Y}khqi$hdu{P z^M3O?yqR$+zeoFY))qa+c}C4>PEv+sNtVb?r~xI~^1%C2t|LD1i)Xm71p;Wu&mxj0 z^(QJ$8#I!2p-c@a3efaHjbJfjpvU^MK|=-L2bKyh*t3n^VyO>u#l)R{!+{ZX|7+MYZ(}0*4hpb3^l@?raf{D~ z)HW45Fy(HhZUM{Nu-bTaL=(pa{!YJx3PNzJU;>Zdb4)QN;AG_%;;&e+VbV1e7#$JN zmdF;Zjk*W%&3Yxa_^(MB4$NZfQa_W@whaMd5wC@E{Od7<5w?TmH+)S_2CR)Z=7i~V zzn~3|=DQp)~HQ{ZCEo1`{dyqEqSJh8EqDVq5UC+O`B)|rhOZ$dj- z;f{fUB3i2kW{Sd-l#v_+aI~WSvSaitJ2RU{R=j?lLlCVmO_g(gA>F6XS}mDV{R%x4 zy|gw%wDacKw|Id40}-`^na^`l$&r+gqO~@M(q%^qNk47`)~aq~VMpP6PN+})GCEmq z4wLOJ$gXlo47=gUX32hQ<-*U00U}h~eQI>-p$1SBM^yr>qbdOwA?$CBcOynsKO{2D zKf#O*l96;=LWAdD64#1ou)EfiS)y(6jB;g9%OvW3mU*x`ALNb&cW6XAH74c@S1#aT z?jRt-?5zyS#I8FN+rmquPJH}V!Nfm{xC1C3cA&9b+_mOFm}xO17X+U+){2k?eeaSX zWIjeurjo5=R^oZ#-zh20&<7N-l(u~Kt+-p1idvKzp6vPH1kyNNkrrQLp=V?bctxqJxKy2eTGg(PPTofd5m;dX49IQS#|JAKEo6zMGG|OSbz5 zQ3PzTs*M51?&}}7){OXy4S(=XNPaxEGv-{|Mz?w5!EIE(cYSU&nu&7u51Vc4H8%%ClQ_b+`;(d72pMD(g4kK$Q4bSycD{5~?41m)`?A%>W^*IH-etbfx z%k@b8!fcl}1kQdOsr&W0?_ay3qsLIM6$TzhM-AF=OtIr?nLjO3N#$SpqQnOV+OvM& zU;0#SmlT%EK=R9A?x44=Q=uqhswlVl`qgQjF_@=*nRb6DdS_to?~tS|Jzlzm)9Tof zF_loV9eK}@XsMvnE&BQJ$<&9Z6OLU6!8p!#AIgT(J``p7UYn=69!Qe8^qbCb?I!Xv zxNX}tl-t6{=kg!iR$?G-&~3sbYI}5O2kN|PYItBvUtD>zbuMiVJ_UP?Jg;l~go!Fs zuL+qt-M{hMOb4Bd@})dokLe*TFU=6O8n3Tp1AM44YzP9x5DN5iTr&)}t{=%EQdQJU zn1D9+Dfanyn(w5KwpIPS(?S@%zuDW}x3W8pE3H_%e=_f2clr_ZH@%@S(NTH2cE9?2 zO;j%7hx6k85A99|`3in|TG}4RwN?{}NeK?-UF=SAws9&M(VYhFy}*z06rgJ$P4M;* zy>m#Y>Hc`urOiT)a7KI=Y0chIT1Gj|;pZ|l^qybFRGkf*o!3&cVn6e2*);Am@`>Lp zqcIT9iBQRjW`fRVPv&6J*w{_CyV=MPSM^6H|=yvhw61{9k%5`fVR+Ob5egxRQ zfz188@gN(MM5q0hiptQ(ZjQ>r$-Itk`WY#&x(48j8fAs}}7{1`&qX|&u#Agu&9qF8nNCp}D(}SNZCb_8{1ikhMExJlGgH`D$CoN!OP@9^cmk5geloqM zaRBVaj(oUY+ubqh(N2_nVf2MMR1)iKZ>PCg*K=pJJX<-u(W+TPi~cYqYVy2s?9v)l zJM7i>t5~&gU2!r-`g+Si`EUsrGHc75HUgni$?&FHrgjq%1GSdw?j51g|%aC!`E`!&tq9j|_=%R72k}uX^(YvX$&I5OO*Vn=hJjRHQcWL(Ck3=w9J{(`+YWKkJzUY>lb(rTD zK8%((rQ;{`Eble{aNd7?Enm^N8t$Q4s3~oAdnw!0-w(kwYq;jHM#{A0O}HyW<8mG$|8d;Q zX7g*kncHt+nk_}*kKARL@ez3ffydNb`pVTJDO&m1faFz(8FJsl2gfDOO?k18jaQt9 zX)I2Ih1LlIjeVehbk0C;EsqxuVX;4K76!5M#Z)?Pp;>N+#@hwmc zGa(^m@No1%MC_pMJK@sp&*hs;hdal!or#L(osx?gzFq+KtP!{1N0%m>6m4y7lsm^c z@b5|dAcBY(}^t2B{b(4Wt%|&Fe%RFHwUr!^siv!?Y6YVun5guR5fWs_+@I5Ql z9`SML34g5bb}0RHc>UFTFqFY1)sPNC^d>|6EUK1q*N*09EsX4o)=zuPr=@26SE~H?d$eps}zSBH53%WRdw8;ysz$QK3$sjzV7?i&u*1NFlvl+ z$ar2#!me(=e-s34A7*n0kFfXE_`fF@i`m)XjpX8FGZ7f%6Io={+>9w*7G8n+UwH9$ zv&0G2MD`rFiKWCeou=9>4Y}{ui&CB%Y$-jzL3~+a@_1f>3F}UrIcA#^o_C#4zFNd- zFpEqXrl7cCP9w3a?un*`84L8j85t6}q4Ug2qS@(U|H&-EPZh3R(sL59+u4{8Z}aEuQ#O+kV*U$dqKSTiZ;Uc?eN2a57OU^n@#IY;rg0m-Z++^vMI6EX#FDcdi^8)wWwupw2+n?0xNw&=}hCa~}&^0|*k z9Z}k?b%N9=Zr00NQV|T08q*8V!chx>bSm`Tvv9X9$Ni(R{sb<7$>P6G;oRep2Q=_gM6zLFIl;_yix>s0qke&PZ@wmXOf>4|kGz?jRnwqaf208KjT zn69QW^4xK6tQ^@xl;`_OO%X!V9dH8BuRj_0W&H z>E^4eB#*xYCa^gckkLwQCmOKe@vsN}aO&jjOmJr5p}wZhK-dZQ&eL#2w>WPzpbPt? zsH2dy6saB1qxG{Aval39oG7-8@E-0C!zJIg#-UIrS_@0VBJR8q=lzZ>eLvXZ zzT--9N!syg@A;{V@D>q=U!<>y{Je5wC{vy|9`!*C!5H?kJoO0aPm-H7wT)6E&+~^a zyqRK?%3r?KS@F(Q|8{ym%jlDAjRmDedA!#7*$xFeK(&tak)M?4@QlyJ4^j^&rX)5D zIk}2D{T}qHom6>I+xLUeUGXy&_Xv>J+(rI~-jxGH;p0LwQv8 z){>H}oD4vF;tZrzAx_4OMDmvL?!H~a-;Es| z#Fh?N#L3q+bCH}}acuzK{IiIo6ac1Ma14;ir@ti@iuS(DzZmyC6a3u24411_;j=B} zz?&~E45vOzk8Fy0EOOu@DijnUE~;;eIkLb3Uee)@Hj`VlwVC9NQd~)I;r2QN+%Ip2 zvS;J-qz1Qf?!EgO@Qcx`a%8h;g7SLrlM_Rab26v%GhKZX$wOYf`n}=aD#Ekc^acK& zd8&@|ZIw|6(?hp@6C>{~P0gc>6hE{|z=tV+bN@@%9k5KK@*Y~7e(Z~GQj#ima(xea z?i|_&6>GW9OS%^OAvGpqS7Ob)Jf|yu9-USnsD{b5+Qdg-?zuMXQKxR!t?0-pJo z(hJoyjHt|%DYM80$Uy(5hpV#nn03lan^|Ai3owVf%G*ueiXoh9nYZFPg%qoM!;jB0gTvq~$;lD&y(i z;L{UQk!}t8l=T6RDZU24-RXpA7a0iwe}!^RSHz_2oYk&@W!JxDg9_fMKa?w}WEpy$ z209BnOBS5#ib8kt0Jz1UB3&|yp0FZ!<6z;7rnD?oBBU7wMC=HAazoeKTB z9n=*~xtS}hFtn{{ZrGy*uLjeubCV_x)0*7Qm&bDKak1=70lOlc5r?W`$sdp2tzsbV z-)H;k(YKxi4sD@?n$z6bMjh79824WeV{bI_Yi_i7K;`={mpz0#hhr}@gZU=Qby=xg ztZa4-YB7IXse}O{57EFP_f%Oj6$6nBMBp>CHPMcua{tPC`iLfps?j?qo0gR!;hAlD z&`i6a9j>vKGgIaR`oSW~yZd7=vAl0g4V}Jk^}>&Xl@i}Lnv;_765`};Or@*WvbNK% zBcJa~7mYMjeeO6`7(bV882sG=fBBN6BPOk>;odWRpnNXV8!Y2K(H%r!$h%>Jz_5qG zP_)a8q^{4JzQW?gi5#^>JOTix)$aY}q(w%tXov9-&tx<3VK1fJ3u1Dm^X`?#s&*a2 ziurJXyT1?q0e;1EoT#t4kW#h3oPfwD*7e> z(zJDh>f80|61qO>;_la(W0o7MxLqXJ-_4twix_iPl#YA0+?Bw!UaV|4pL`M?<#k-1 zAra00?5ESy@^0*x?LKI+2e>9N@hdS&%UFwK&hxM*O$;Qj=gDwOB}`#6Jm2WHTczwM z+{hr6D~}p0La8(zze(f|Ewjh?-ZY${+HIcmjRqCtts#r)-EfXy&+7^% zm%E=?A(QQJk3XLfEc1@^$Q67YD*r`;%FznK*Rk+ff?d=^n&hCJkgY~K8X3(80uWGr z=B;w4GNRKDufAodOoq1Q)}LpY9%)3@y79j6mj3Mn2Gp~DF>Jq0C8%txuPTPKIcc11 zdfKmM9a(^u%|^Q7{56#BtX(u%XYzBOFI8pJ-`Q&%ug|Txw@jmaaKqXxrv7DlLmVpx zvqdWB8*8ZyGse5iUuap8ZyNqRv{xq$Z&`TrQDd;wH|bz%7|wi?FFgs+NtrkLN*`0= z2Y5g7&U_1oDnw`~;-Pu_*f)U|dz;D!nR2WCwujIqISiiB)$FGTC$XELchMOYJsROzbK)iG`D^u%$9DL> zhAS%^;~es-($R}_)`+^FgkrIoA+WKN8!P%yH*RPtSm5^Er#)6#8KTdhOoPpt{iofZ z1d}W7(@P%6%&o9w$sw>pCgsEqPtqvJxn-_5?@nH5B2q@eR#r0MU`X0?16jm75}l+B`D zJI{`66DHM#$k%a$jA$E24cy#fvKJ{_n#9*lHGU}!3=P9P@u#G3WPP#3Z-+%kBu^?) zQKEgCNyvrBBzwd|;0XC8a;)BU$)v*y{dc1{Dim@LRaVP-cXy7C>Mj8#s;T^@ z)cr)OkG518KTI+EP&&IfHXuokVqRVm*xGQSWNzWLwVjWqItx^nddF<|tQ-64MrL!a zipQ{5E+7_}i}msSlxsLlZ@F*aafL?#8Ex}5*P>!VqvOsmB{tRMBa7SRA?>Q_EBaIU zocjPA3OJ_(Z_9e31PhbGRsC?V$nPQ0)EErWGSc7$KY2&C^MKAZ^Yjx3)X>cd%6TdQ zwc;q4_E84Mk5@;Pukbr@!J3Q!0}%$qaa&`>!F5ETvX7W0g38YzSoC?P55`l9*VC{k zT~eoRPcCnho<6%6V)eAUQKd3=pLGjpCx?f>t1J;aXvYU^nX9rFj#W4RrF%Qr1JKUn zfxBv?=P`XtewBtEZM1_<-`VBReIOryW`5eEZw22x473MR6_^82g0z*Tk*RkSOtbhl zA0K?;`0zL@+<5Yeo!8L5;pq?IniR#8GfP zr!Lo>U&WR0@7MSsm)Za!XOlUXFvdu*i!pSFxz!CWdb{+)6fdy<;{q_6qE%T|_Tgt{=SyGQj!z9se#qwSiK5DJcS%`Ci~*gs7K%Dlsp9;^ zyL%@Lknr3j6CjZRUZR-`OU&Dl4ETdy-j==ZQtjHS`%|r76J}6fP-hJFb${(C8<0kN z8}+Cv0`M6)%L686Oe@%T63~-&>yOWpy|q|&J4_#9{3Ia?kjqfj_QgksAgGLeubvwS zO${3aI_Z!7)=QT6FpfD@MSQs3s?K#Z8eEHg7&xK=d+h zB*6hK2ZsUGG?Yi|tY9{)m*}0{8q3--#75+cwDmbqiZa+)Wf6&HD^|~mOxMxQ36h2V zV`jRb1xx0d&ONYUlqlwK_w&2Y{Fa`>#YOgEzMI*gQfn;oobecMyqCSS+&ytD1x(f1 z+5bu}WM_~pw-d9e=ILU!AZ|J#Oe5wgQ1wt-`hnM~-DhXUFf#XwaBZBxL$*&wc|OSV z+8)G;JPq@QewacFVjz)6f2SmPq`ZF4dZI#0OQ~a zL442L+Q3hqYz~vTooSCpMgfeH7cyN*d0yZ0WPeIO{o;Ij0v`mGA^!UhRa3i;hY2 zE-o#gJflY6qeYxX0#;S>&&^sXZ&n8A^0ox(-73C$(xfFfZ2@NS;L}-f{7XB_4V>4c zB0`utI{Ge7ZU44a)ffXB^&9vyQ332&MNghBu~B4$2j7vKrrTq|M!71(A-NrdlV}u1yc1{oSIW8@YmY4FzosLc5JH zsiwzIhfZV}gA(78(N6GwJypwjni)D&VSELP?MdizW>UH!yP1BHhU~lgE!32=v%w zNCbLYW6>dnna+|c*BI)5*tdY59UrDu%ExR(TuElV&+2R;4Cmpglt6{6sMe|2aqF*> z(9kik@FHVmuAXbVobTa-E%c?Hx)_Z%(9PMI}LDUN*S^U6A(bvd6othqD_S z?|8pP)tBkX8~W`!<}U!rFX<4r;s znHHvQiOxG~g%(An#ZFeqE(b4{B|Z41mL3@}2t^VtgR0AUd>=#sW{@04WycYchb>Te zbXSD3G9a|4?f8ttM#anMiXCa@#eD2*AYCiEyM49zZJ;Dxx5!J?;c(LGT56s4LEUd}tt@eEHl3`^df z#*N$zT2w^+7^gOciwXd^_{4m#7J!gN593Te2wwp*?A9Ut7SdZo4xNBboFrVn^W+Br z#xifI-Yr#~wOuUvxMlj~MnA3`c7Exf zCai+si&OMBnKV>$!|4KoOrdHBd+r$WvbFL-(en$xr@WVUx@8TJi*;R};mo`GHuI5T zly@O9LIzFH1y;5{5ob#~KGV}+90iVS7a`piyg^>S7RmhxfWlxq4rtLurjPUz@Tk*E zzDQ~gq_jaKTexoD(t)$E*E`;&=!$&D=1N~>c$$n3xx8qa+JKtceGG1DbW1js% zaKzN*GETjb+ApEV3Lx@wDV4^93{{_fMA>aEjZr@CcR0xCZF%%w+ZN3C6ta;#ej48Z zzS~D;f|mt(uHP43 zaNPXzCQbX8ppb<5_H|hzU$XRf-@BXXa((Sok5O5^@LCqCH=BnIP+7QT@^PkB^<{PF zNZC!&$q1O&s9Az5MdIRYtm5uCYUQHFnGLDgCWiG&Zn^Oic7wc+$lngGzC~P`07OTK znKHQ%uq?_vVzAzHMF&Fe>_f9ZX1DY^w9+4OI37N_BF^| zDXkJ6rmb?`HROh?CukMt8J*l(%g?0K>>tJ;ZEw2$elUe}9h$i=zkq*UA6T6^L1q-l z0C(RxXf1`k@;m-Pa2RfU&NMh8*Er;0Z+-3d>!hVI_vkhGNz-LmyN0vA>o=n>#<5SR zGCndzUFEH>KVL~--J89DTzN60=&&MSlZ~w}IAM%|%#C~f{4(TE*+EDaTG`lcst{BP z$MsOPJq*9%gZW(SK}78(H(auA46g8jnNN(SzKbyO9jEIIGC|d)7Ac{fe35tdLu3&O zPj%!G&uf-i4y8r<@7@^s0>K*@U!C~{HX7ul_#z?-t_ZaHHGo7(7g4~rgj!(x)m1pv z<^cSzS?Cq(21CLlr0?Bbv)f20*k?FOL^2ksOnmb$Fbuxcy(bvsFmv>^e_-qwlv`G@ zg|`O1pgTDOhHt(lLMRJ=SvCHH4w?DI1GXBnw6`xHNmJ7>pY1&O-Ki*Ckoe7;uhE$Z z#HN;?sMP6J-ZbQ5yri}FCo;SdblJHT;@&OS=yrvuwmb3>m^wk1Uw<+_ZErMqF~IlL zP3|tX_2i>ge{rV#vvq=q^}{0wBUj96>5@?!J#;fkzFpW$kA8PR6xwc(@iAl|&uzx2 zbF9L+7mBx-AnEi5nTQ0v)vX+41=)RUdQU?|A5)&MHF82wSiPjKLf2?=z4Zf?_+VZo z1B96Y`1|`;9pa8rf^*EG`Z{>%hKUBAV%+0jfD1DuAc7prs687vh@M|)psOmc@GIe? z%V}IEBtodSJuYtjMTML_h$7mNg0D1x|22J4pb9*%SqF5No~)zyUdnxUxQ)5J`6Ph=Btm`=QZE5hK36t_~(N86Huz2o)K+L#PRy2zaKw_y}bO=<16n$qNtlQd98Qt ze&tUPd4%-yuZ_J)gN2e5K?%6uE-uaz{GOcmNM zHP)11t#9Lcb;3m2*>WfPGK3wG4EFIvTr&E;$X^HOE5kvlP@XSH!W0qcEPUxT(0CzL z*zc7jv>0H|#JT7JP3^~SW0B}q6axyq0;MxKSOecWR5!BB9d{f_PTeDBmhtZh#l{b2 zx$ED#%LS)`4Nfz+YTO~m;2sw|K03zHe(=Dm#PMV-JNWVSr%S7_r-`o+K((QDkd?Q$ zOJW;)B9t67k)+i>!uPc&Ba$id7*Ok#bu9NCkMqD)H{mJQ39#dByw@8qseyLmc2MK@ z>T}7|G|=PoD{%EQzt?bu>Ln_>Vd$0GwjU8x(8GrF>>{ZlW{QOmyx>r2s9MDa4bK7( za2@U*BCVyFr0oWtB9^uX2BNb%&3=wRQ`j?HZ6{=LL6XsjmGAX^JB5&aMYn<560na> z$Y)iwtY4-o0ieo7cOS7S)tK8BNGs4un0AV6APM3^19e7N0DSx&BVDtSM%G>BsRv+w zCuvYgm&3LTdmi&yX%cP&!`+x8y|Z;NmZG3}H!=kg!Ue8Zr&`4$PR7C*Ba&kNJij(Fu^X23eW~^8$E>@4B9zu}_u;H%|D3%X zS)&v8JR>Uxm|7VijNvH?=^5xG$*g-|p`TcHY_Gz#w-sph5!z4i5w^M+AP@*gNF20X zBzCqiait8NESHD&z-lPo8r*aWhu2 zPyXNE{re?;a}4-aqbg*7S`bDFPkNP81A730tWLrBVsx?bX+_b|dz|vL`2WHbDs@0lgMsUq944RU;)aUI8ywVYeU6m10sjK+_i~F^iUpND1A0cJ z4dNd1{O~lm^RNB(0`F$Hn9)BF_@9gY_pkiNmjCzY{~1KR$(Iq2O(-rEz#f)98H}O$ zzQ;3J&X=Hgc$1{+cg;0vmH4L!{5M4e^pcGpI<&gHJERnyY(d{~zzcY$kb0o8IQ~3! zxWuU8&3|!&P?^84Usq=HwNR^Cmi46Ke?9(#)nr)l@i;_QbtnGG?SGwt8!53`8Ck3K ze}VA_?+E4k`@d(+6t-jg|I)4+JBnMxJ4+M)4f$_&``>c^Lng|?{1?sqUqdRdcQq@m z*^4_`ps270IexJAeJi8HjO4;?^%vt`*T6N8nySTlcoKM}H*Zh0wTg8An=RO4{C$yY z�mnz81c+Z>^7MlgVkgsLwB0-zTxk6xQ+96FdOE&(9P~W*?Z69-lY~=yW6a!x;Y; zs!+C2K8pRbT#NEq=++W9KTF!drng-9T94X=2HLA?gu5+!{Mxs2BfLG_0ayRUvH@X# zyehU^Y!K(aswv%)Cs}VhQ5YldUuDtV0@>=8pRNRd=)U^+=s%YGgL`+_vZ2PJ*H1L6 z{a53kC75|IUrmPRYhK^JRuU3-%71%I@}B^r1zZzsT}&hCg}e!{$m#9~qqT2*d`4)- zIOOukAiIPde}z{5wW-J~6jCl{Rf4`^lNWU=Fb=UqpIQfxh2@Ra5&f1Jf60(fT-xW?t$!A{Qp)*rvw!fEUG zPkpQgK)*v=&x(2vVT4Ed;y_yN=9~3QT~|E^xU&8!xlp&SqTr-c?WDybFIrY$7x?*1+M?X(wkP)>fLFg-cf(T$zF1oP)hNNT_wKJ`@iU;``*@tYWf-Zw_-8u z=uVb5{vDIkh8Nv6F;eFW3aP#qf>Z{McUYRm`2R$Nj7cEY=?y!ccev(+kX&?^=^KBU z;-XE~81}wAGPMNGf3AWSaE}s2OD2w!|2+GD9@sy~;(w3+i>>|(qyNK?jLH9L?>nQK z+_tXO!?|$eCbj6w4(tf(S@^S0z_I{lQ( z09JeQ*^Ym!aqpjfBb(QY(}`X8bxKv?=`1@0r!smyGEC%aiblGIzML1=F(q_&*BX(Y z`Nqb3Rb+0QMfJ<(e%k>u4I3sxw7fi9p*=jAuH&$#F+C3y!iGWslESxAkiCE`IEcEi=y~dN)MsCy zRGfeRzZ7Rg2Jl&#y2J zpw$c2Z;VxClN+h2-J?B-u0=W!y1>>!?oU2ntRK)mj#w-y!VPE6-W3ZHV*H;6`W4A$ zF=~;_8GmxmFm@ytJiBppT8CJ@o_*nBYlys_?L^1gGN*g9t6nRtEwn}Tx`=|#umfhD zjBxDjf{AgqGkqv@fp$Z-38hpvDmf3mTNt+1xAgJVF3@&yVW*|@+5Z91qt>!RNenfW zK-A-|m|fe@#PuXh=em!kjRzVUmU$({9}?kOFWg&}7AMm1zC^snVJw3kxH2d-mrA5ju-GD< z$yjV(Z0j!?`-rymN;G`&kVi=E=6Tu{1`1fwJ>H0*moMk!v+fUbD=}dk#6)u;(bm>F z({0t2hlyx$C40jGaz{jNt|9lz5G@Gdw^vTDg%B|v;N-JnJ#4CaVz?!T@*4Sw-*}2Y z3F|D(oiny+nG2^RCdN{WZEVWh9?D0>vK4k;I?GbY>OiFf3fFzY9a@9*1^%ansoumd zn7o_83)xhRj0CCqm0(p7`!T*?8Kilt9e)6x#L=jL;8O z_xegCCnHr+Pvpg2P5sA>M5D~3=l7QwXuFOdCprkvCoXNG#cRYx9rQKEb4MLD1%=m* z?om@F#16blZZGN|D}AtER@5cLZ>PG^dxS^Yjfe_6!#MA4SXAtax*ro;6J#|lnY0Xc ziY6x7WzVJI26*=vdHLoqJZHD^S2w0HaqOg{O-`H^WtW*#f2L85vn!)n4vEx*3(Jx= zJFEet-^lZ}TQz&{xhAwe4b)^o$!HTF&j>GsZ9KVF!qXd3=;fM!EnXfK68}+vE4$*Zztf6DHY~IIwtu`8v{G07O(CGuFfRAY@!VI>=ilXivV=Rz zPFt+%S&jI&cbQ`!-;H>5GC?KeUtF(zDZ_nhw_v=^nB-%Ah@m@E=L1)Svhb>wIK*i* zTw>Iaocr{%$z_pfM>^E^aZ)+evT~D!Ya-|x4|)IN_Za)JgJW42`O^-#5#AEax^@^g zyq}X6yFPdac>ZWD;F9(UBX5$M`JN|MOj&jAo#Vm;&(_zSxnwN1GUEU$-1OpX9weqH z64ws&s|;20qpD6`MS+L7BU$JIxQfMn7Gbv-g|WOz=nezTyPO)}pbI1@k%6XpecLRdJULoy+HN z&-E@JPr=x>edC2Ps_+%>b`NV3}*7q*q$g@IJmmfg<$_p(2 za_RN=@(Q@_;>wT7sPahbIjvP%-5#1;sNQlVVEp1D%#$fmnal?=%P>!?nok=El~=Jv z1sqT5U+m|%U&?Y}TB^9qrADu=Xer7Om=^xQX zFSOCSw<^i*tGchsdZ#vDX+PP-QUcXF`vbxIx1n5*)XUOh$KbMRdmriX*gn0T?B$O) zo_g(LI+tu&QDchda`lg2xtigXYv#HvAlnSS?nGCjy8Vs6-K0?!pB~`$!X`hyelOp7 zL`7=gd7BahKGIcpRKAXWY7Mh8eyu#Q1dxkW!E{=kViVoPekDo*hM0uKj?~|+9c~;r z7tBZ3M(;O~OZJZQ22xNb?c7=Nhq(Swb9v|C2t%8DHj4^Di~VmURd%#CoQ+5?T7q>A z+NgxAGUBly9?9vG6I7osR42qZ;CbwB9@y)%wO?uj)NSlM2WwuMSUDiOlt}`*A1f_| z-JmsKGso2?GU8Ye^Y8xA@~zRuaKDkuDeftzyl#Hd2T6o=>4i;H46>}WJKrj4inqFU z08Ju5O=DG>h%?xlN&=YYtW-5L1=g1 zz6Nw3u=bU~2{%gqtWmeTLa!jlp7foQS@St)S0+13c5HZ}R;eVS|BWh#i!qn7vzu>+ z`hHN?Gm98sC;PGVfB&7oRiG~AFMPNqvMw{HUC+xmtF;UiQI_OvG*018{@KD_AV)H` zN6HZU&`?eMNn_B!63a0Ya2x#~=}TOk`aYUhv?nqx{~%0?n28vjIik8u;`#_-f|=AP zui=dL(8>i-E1Uim^+-zc?q1%q>@7ZVaYvoOk?HT_wOcWkmQ9>x<^d~RXs4OQp&0+k zcTl7Adx8mQoK_vH-$#`QQ4ASu439p!Bv*wk32nAIwtk+7^ahV~ja)5;IX>}?r6<|# z&}uR01kVptxY>d7-M|P5Guxz79yR$|+&v98TXIzLDM;@!xdB_Z+yqH1oHlW4gJnJ+ z4HOlX?u*`=&whnKudD1xZ>y(>_{u~rz7=?%Be#ZJelS%vy&q@i-hI+4%^BYRR+=DH z);Mqx>a4WYopi3^T7UeNojvJElXl0~HntfhsYRAnS3B(A#AixWD`;sD{U1nsM7G2+ zR+5nvdny)J*Al9t#X{uKKLXVj%92IHcgwk%f4VthcUgD7w}@-q*lwe`=`Z(8!K*_h zAwgzLn(-jQVCi(NQgxzFTh?i8i?5bYo_{d9i3a&{QQ)Z zkMLt9i~=45q2da3H?v38#Xo{K-892YJ1%N)0lZPIG1LmCyr0qG<7n~!IWeZ zPZ=u%7qF^4aijQcBw=7ZMn-tI4fqCw7%ZHE_aOXmwsd3rDemIXVr$2j8rnZW%1+w) zTP~KhQUsBr>BgePj;g1m>=c+uN~Q8&zBZLo3?$w}vFJ<$FZ$f*Le~`7hJx^CtozL$ zFUeei|2fz=E6iA>D$V`X*!WH%q{%(g*57*~Xvk^8%!;yQ zMa41Q=x>Wp{ijHPZd5hw{w-&FTbVR`#Uo-u#KTQy;+`$yGWU}A4`@KDrHXe-R|-mN zKPfu>d|pAE#1mGH3E7v0n*Wrg%O{T{8% z&7L0(C*_}{54A*+nkM;7(@E}+wv8Wrr49ilNurXf(FL|Mi(-%Y+RC{UZ9sGTT9OX# zzwOy#8pb((AhMqsho4m>*4lt00Tg8{O@%p%e}aYOF8neWtF<@PELpo{*2WHVnuoQ~}q9VMp9-tdV$d;N|Q z!=oWePLOj+3S0}BmPcy*ohQFMcIq5!$;1M}&7W*{QV$e$7F<``$(}P0Hgv{@x`w zUcoHt`#6;kKWgGPXRdEqw;!Xe@LRjoTEosoghQ$WZ5W$kYqtf#{F5=L(ezqS~P3)g5xva`rt#)B50oGx2-$b|D=g|F?ExrTT3I$!@megtoU$D15QNNG|8PlqL8brN`Pqr z?xWJRva)a!Sznim`OrTBxKBjPwvR@toD zqJ~dx#$w)`bv(Y^1Aub}m*`J6i0-VtnI&(E>rty4=xf~=X#s~Vv$&$TXP7=Witq02 zp#m1z3x*%XzQF|`zs>5WN|*aQOU#9Z(T3`Tz&LAB%E|EqFs*TYjpU7m4tJ)4(OoSyLK}8SI8)JRQSk5MKmUP{ zE*fw{_AB>}tF{brMVG?%zT4oebVzfCQ93RSHY?Cc9Yx*vt@ zWqaJhtbCq45^qc^}Hk7HsZVl*HY1&Jb{~{{Q-|_PXdF%wr4;5fA?;fFEZ^BN6sUY;Wx`E5~JOOVYy zx-vWaho^-p}K{!3(C2&@ItJ`!owT6g0{RyDN`UCr7aCCAZ1igcQORDT$b z-3R{M?_PTS(yDBWG$Y)$0{@XpNaZhBa3dz(P7aM($lH-!R4O3;_XsDc`Tp)PEYhDG z1k{wZ6TPZoV0608g3C;kufy2iCvy$}2OZtN?$8wbabM-13p?-EWcB~Pdkjnko~fQ~ zOV0Gr|NGY2&2d&xoHKj>gS7wWU$p7mU@v)Ro-DdFTAyhzXg}a$gZ$9UK1WYW$U;$d7Jck zKVJJZs9R~Y{rus9tPo&acZD7tr=I2XutJ^3%k+j$Y$Z4rS*Lm1DU}b-4^|Y{DPL}( z`eN#fLh#N`m!~!Tbc;>5u;m1wUl#8*;E6T(?-*XY*eXci3eB1gD`qfm41m8O#(za2 zXCe}JyJ__h?kI8BSN>DkJW-gJ{79!1gTg zA0dy^OoK`e0&* z7^}{Ra~D|P(w0X`xj_bXWYDDrs_apq7R& zBO|SALTg{Y_S5ND-rd`PoPB@7*52hBTmdq`!un(QPiznLj88n!2gcZxv&P=VOG72$8S>nr5cYToMUFuZ!x0gP2~jj>9> z5fQXTBDul4r{Q66NCK}G4Fy}l<!hQ5Njpyr(&=0l%56f&G+_4#VoGq}3W* z>~weet(DEIvR!O)Od2V-v!%GEA3pK!;D?pFJzNDh!b4RpiRVaCiZZQmSsF_~R>?uC z*MAyo@)GokpdIeyD?o2CwsR?^q0Y!+r-C^~zAB!NKjF8CQsq}+;$gJ!@?1(l6K9+I z3xQm}G?RQ`M3q_#OgB>KliOIie&j@OQ*xE+E2OE$AqTs^$PVL&Tq?G{s0%aSJd`EW zw|yGw` zSm(`7Vyg!eEaK%t%pswzv5|jj%D49`*nA>lIJYJvrb1p{JfY0HaHX2?3Q^-{HcBc4 zPAs(ce(qgIMbhkXK0lZm*?qKJdhWDPZX6(1UMNmPdKPL5$POQlJ2(?xKGFE|;5v!! z4#|si6u6*}!zV&*23IDdkb6zHr;2{5$KPmy^(V-#6ULM5<5bi&Tv)$4P_1`3jxeX7 z@peubd!b&0NT|5GV%2R^!=@YY!O@t4PQ1{i09CS5eH4&mZ~P}3LwT!Lbm=(dd^rE= zINtwyd~#Up-xRH-Oi>??;aHu2;20qvp@#2W%qHR`O|e=hHm3AV?hcPWhQFNhK919K z#JdkxItw|OFRfTxOI!kOnB5g9-ltzYk@)DN*?5b=rKeb5cDTL-22!7K)}g3qJ{VplIjKn`TzDi)6_=>G$@@iZp;wZ+@<>HZWEwBgrnpaqCeHm~;L)$gLXD{irx6D^e)BU4P`s=gi( zJoO(QYEtY?Gv!d=f1QjT6k%s$Hxc5S2=IEs2Wj`g*7DeQMzQvzlxWca-^uS z<2qYf2aN!4Zya@0%UMku=BfJo{PfGhwOnC5$L$s@)y+iw3>(j%sw3lGUp^N12^W9- zj>2H@fU)|M5cSH}^eFyw|7%l%8YW_#IFPaPx-C%8)XN=GwvtmxyrQ=;A;bGr;YH4^ zv%yr$;szKvMj}%JI3e~&POKF$tM$WH1PdcN@L4CpBj79 z+5OKqo}{wX1`Qj*$fx^6hbrh8YSX(t%nS!(>nMHN-w)rH#ib(wBHxURhpK#a*YQ2) zYhMWb>)Y0WWU@hE@16FW755W{Zr`9;NGNmZE~gt@m{B$xh<<#_USgXGXNH)6^}E)_ z<4UNT`weCIptbr#Uuj}u{3^yrWbR{^p9U2~rsVYJ-GsfOr8?ZvVMIzW+$<^MTR8xA z^0R`CYiBcfAutu7gj=S(QE|Tpbf53H*^Iof@O@IB;JYom{B$1hlaWj11Z*3%rGJcl zXBa}^)k`?Te!7R1$W_kIW+FXfr*yP#lS()y7~H?QZnpzRT!iXb3Kv_kD2U^#+UxQh zWig$1k44R~Lmo^_Sk3^mczBPR!j8(1hj=Vx8klII&+>R6aAyTxHBz5M!Fja(vY*1Z zr1lTSj-#W2Dp{s-R>A~|=Oxg%hcod*q567?N^CnHQWf%#8blFhF(L%*h+8jN@Pr);75?VSK0Cv>LhluekmE+ zDxw4uq_<*UZ20(4^EI8gRXJhg!1#R6b|H`!Q18*9;9N@v33Yel-&tMAN=hZw3a-k< zev;a?b`RXQXcpd-=FYE@^|U*Wxh+P4|K-}=`l-&2axmHnXvwh|4Z}DPb26Mk*rmqxiRWHgNvL<_b3W+@pSmKhD+WBOY3Yu=p|K6}a z44GmGj*=IsEx7XOTt||;4?OW8iRZ%qw|e^=692cWI=6fNFXNL;xJ2gcNxmE?MlD!( Q0r&ymy{}QMZvE>204gbGQUCw| diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts deleted file mode 100644 index 7c144a724..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/lib/index.ts +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -// Imports -import * as kinesisFirehose from 'aws-cdk-lib/aws-kinesisfirehose'; -import * as kinesisAnalytics from 'aws-cdk-lib/aws-kinesisanalytics'; -import { KinesisFirehoseToS3, KinesisFirehoseToS3Props } from '@aws-solutions-constructs/aws-kinesisfirehose-s3'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as logs from 'aws-cdk-lib/aws-logs'; -import * as iam from 'aws-cdk-lib/aws-iam'; -import * as defaults from '@aws-solutions-constructs/core'; -// Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate -import { Construct } from 'constructs'; - -/** - * The properties for the KinesisFirehoseToAnalyticsAndS3 class. - */ -export interface KinesisFirehoseToAnalyticsAndS3Props { - /** - * Optional user-provided props to override the default props for the Kinesis Firehose delivery stream. - * - * @default - Default props are used. - */ - readonly kinesisFirehoseProps?: kinesisFirehose.CfnDeliveryStreamProps | any, - /** - * Optional user-provided props to override the default props for the Kinesis Analytics application. - * - * @default - Default props are used. - */ - readonly kinesisAnalyticsProps?: kinesisAnalytics.CfnApplicationProps, - /** - * Existing instance of S3 Bucket object, providing both this and `bucketProps` will cause an error. - * - * @default - None - */ - readonly existingBucketObj?: s3.IBucket, - /** - * User provided props to override the default props for the S3 Bucket. - * - * @default - Default props are used - */ - readonly bucketProps?: s3.BucketProps, - /** - * User provided props to override the default props for the CloudWatchLogs LogGroup. - * - * @default - Default props are used - */ - readonly logGroupProps?: logs.LogGroupProps - /** - * Optional user provided props to override the default props for the S3 Logging Bucket. - * - * @default - Default props are used - */ - readonly loggingBucketProps?: s3.BucketProps; - /** - * Whether to turn on Access Logs for the S3 bucket with the associated storage costs. - * Enabling Access Logging is a best practice. - * - * @default - true - */ - readonly logS3AccessLogs?: boolean; -} - -/** - * @summary The KinesisFirehoseToAnalyticsAndS3 class. - */ -export class KinesisFirehoseToAnalyticsAndS3 extends Construct { - public readonly kinesisAnalytics: kinesisAnalytics.CfnApplication; - public readonly kinesisFirehose: kinesisFirehose.CfnDeliveryStream; - public readonly kinesisFirehoseRole: iam.Role; - public readonly kinesisFirehoseLogGroup: logs.LogGroup; - public readonly s3Bucket?: s3.Bucket; - public readonly s3LoggingBucket?: s3.Bucket; - public readonly s3BucketInterface: s3.IBucket; - - /** - * @summary Constructs a new instance of the KinesisFirehoseToAnalyticsAndS3 class. - * @param {cdk.App} scope - represents the scope for all the resources. - * @param {string} id - this is a a scope-unique id. - * @param {KinesisFirehoseToAnalyticsAndS3Props} props - user provided props for the construct - * @since 0.8.0 - * @access public - */ - constructor(scope: Construct, id: string, props: KinesisFirehoseToAnalyticsAndS3Props) { - super(scope, id); - - // All our tests are based upon this behavior being on, so we're setting - // context here rather than assuming the client will set it - this.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); - - // Setup the kinesisfirehose-s3 pattern - const kinesisFirehoseToS3Props: KinesisFirehoseToS3Props = { - kinesisFirehoseProps: props.kinesisFirehoseProps, - existingBucketObj: props.existingBucketObj, - bucketProps: props.bucketProps, - logGroupProps: props.logGroupProps, - loggingBucketProps: props.loggingBucketProps, - logS3AccessLogs: props.logS3AccessLogs - }; - - // Add the kinesisfirehose-s3 pattern - const kfs = new KinesisFirehoseToS3(this, 'KinesisFirehoseToS3', kinesisFirehoseToS3Props); - - // Add the Kinesis Analytics application - this.kinesisAnalytics = defaults.buildKinesisAnalyticsApp(this, { - kinesisFirehose: kfs.kinesisFirehose, - kinesisAnalyticsProps: props.kinesisAnalyticsProps - }); - - this.kinesisFirehose = kfs.kinesisFirehose; - this.kinesisFirehoseLogGroup = kfs.kinesisFirehoseLogGroup; - this.kinesisFirehoseRole = kfs.kinesisFirehoseRole; - this.s3Bucket = kfs.s3Bucket; - this.s3LoggingBucket = kfs.s3LoggingBucket; - this.s3BucketInterface = kfs.s3BucketInterface; - } -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json deleted file mode 100644 index 21cde97d4..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/package.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "name": "@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics", - "version": "0.0.0", - "description": "CDK constructs for defining an interaction between an Amazon Kinesis Data Firehose delivery stream and (1) an Amazon S3 bucket, and (2) an Amazon Kinesis Data Analytics application.", - "main": "lib/index.js", - "types": "lib/index.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/awslabs/aws-solutions-constructs.git", - "directory": "source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics" - }, - "author": { - "name": "Amazon Web Services", - "url": "https://aws.amazon.com", - "organization": true - }, - "license": "Apache-2.0", - "scripts": { - "build": "tsc -b .", - "lint": "eslint -c ../eslintrc.yml --ext=.js,.ts . && tslint --project .", - "lint-fix": "eslint -c ../eslintrc.yml --ext=.js,.ts --fix .", - "test": "jest --coverage", - "clean": "tsc -b --clean", - "watch": "tsc -b -w", - "integ": "cdk-integ", - "integ-assert": "cdk-integ-assert-v2", - "integ-no-clean": "cdk-integ --no-clean", - "jsii": "jsii", - "jsii-pacmak": "jsii-pacmak", - "build+lint+test": "npm run jsii && npm run lint && npm test && npm run integ-assert", - "snapshot-update": "npm run jsii && npm test -- -u && npm run integ-assert" - }, - "jsii": { - "outdir": "dist", - "targets": { - "java": { - "package": "software.amazon.awsconstructs.services.kinesisfirehoses3kinesisanalytics", - "maven": { - "groupId": "software.amazon.awsconstructs", - "artifactId": "kinesisfirehoses3kinesisanalytics" - } - }, - "dotnet": { - "namespace": "Amazon.SolutionsConstructs.AWS.KinesisFirehoseS3KinesisAnalytics", - "packageId": "Amazon.SolutionsConstructs.AWS.KinesisFirehoseS3KinesisAnalytics", - "signAssembly": true, - "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png" - }, - "python": { - "distName": "aws-solutions-constructs.aws-kinesis-firehose-s3-kinesis-analytics", - "module": "aws_solutions_constructs.aws_kinesis_firehose_s3_kinesis_analytics" - } - } - }, - "dependencies": { - "@aws-cdk/aws-iam": "0.0.0", - "@aws-cdk/aws-kinesis": "0.0.0", - "@aws-cdk/aws-kinesisanalytics": "0.0.0", - "@aws-cdk/aws-kinesisfirehose": "0.0.0", - "@aws-cdk/aws-s3": "0.0.0", - "@aws-cdk/aws-logs": "0.0.0", - "@aws-cdk/core": "0.0.0", - "@aws-solutions-constructs/core": "0.0.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "0.0.0", - "constructs": "^3.2.0" - }, - "devDependencies": { - "@types/jest": "^27.4.0", - "@types/node": "^10.3.0" - }, - "jest": { - "moduleFileExtensions": [ - "js" - ], - "coverageReporters": [ - "text", - [ - "lcov", - { - "projectRoot": "../../../../" - } - ] - ] - }, - "peerDependencies": { - "@aws-cdk/aws-iam": "0.0.0", - "@aws-cdk/aws-kinesis": "0.0.0", - "@aws-cdk/aws-kinesisanalytics": "0.0.0", - "@aws-cdk/aws-kinesisfirehose": "0.0.0", - "@aws-cdk/aws-s3": "0.0.0", - "@aws-cdk/core": "0.0.0", - "@aws-solutions-constructs/core": "0.0.0", - "@aws-solutions-constructs/aws-kinesisfirehose-s3": "0.0.0", - "constructs": "^3.2.0", - "@aws-cdk/aws-logs": "0.0.0" - }, - "keywords": [ - "aws", - "cdk", - "awscdk", - "AWS Solutions Constructs", - "Amazon S3", - "Amazon Kinesis Data Firehose", - "Amazon Kinesis Data Analytics" - ] -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json deleted file mode 100644 index c57d17329..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.expected.json +++ /dev/null @@ -1,535 +0,0 @@ -{ - "Resources": { - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "BucketName": "custom-logging-bucket", - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W35", - "reason": "This S3 bucket is used as the access logging bucket for another bucket" - } - ] - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketPolicy7DF00567": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "s3:PutObject", - "Condition": { - "ArnLike": { - "aws:SourceArn": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - } - }, - "StringEquals": { - "aws:SourceAccount": { - "Ref": "AWS::AccountId" - } - } - }, - "Effect": "Allow", - "Principal": { - "Service": "logging.s3.amazonaws.com" - }, - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A", - "Arn" - ] - }, - "/*" - ] - ] - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } - ] - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3LoggingBucketE14ECC0A" - } - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete" - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketPolicy55E9C081": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F": { - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" - }, - { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" - } - ] - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2": { - "Type": "AWS::Logs::LogStream", - "Properties": { - "LogGroupName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - } - }, - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain" - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "firehose.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehosePolicy9CE17DCF": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:AbortMultipartUpload", - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - "s3:ListBucketMultipartUploads", - "s3:PutObject" - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "logs:PutLogEvents", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":logs:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":log-group:", - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - }, - ":log-stream:", - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2" - } - ] - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehosePolicy9CE17DCF", - "Roles": [ - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC" - } - ] - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007": { - "Type": "AWS::KinesisFirehose::DeliveryStream", - "Properties": { - "DeliveryStreamEncryptionConfigurationInput": { - "KeyType": "AWS_OWNED_CMK" - }, - "DeliveryStreamName": "KinesisFirehosecustomLoggingBuckicss3KinesisFirehoseToS3E91CB2F9", - "ExtendedS3DestinationConfiguration": { - "BucketARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "BufferingHints": { - "IntervalInSeconds": 300, - "SizeInMBs": 5 - }, - "CloudWatchLoggingOptions": { - "Enabled": true, - "LogGroupName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - }, - "LogStreamName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2" - } - }, - "CompressionFormat": "GZIP", - "EncryptionConfiguration": { - "KMSEncryptionConfig": { - "AWSKMSKeyARN": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":kms:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":alias/aws/s3" - ] - ] - } - } - }, - "RoleARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC", - "Arn" - ] - } - } - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "kinesisanalytics.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "firehose:DescribeDeliveryStream", - "firehose:Get*" - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007", - "Arn" - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF", - "Roles": [ - { - "Ref": "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD" - } - ] - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalytics0C0663D4": { - "Type": "AWS::KinesisAnalytics::Application", - "Properties": { - "Inputs": [ - { - "InputSchema": { - "RecordColumns": [ - { - "Mapping": "$.ticker_symbol", - "Name": "ticker_symbol", - "SqlType": "VARCHAR(4)" - }, - { - "Mapping": "$.sector", - "Name": "sector", - "SqlType": "VARCHAR(16)" - }, - { - "Mapping": "$.change", - "Name": "change", - "SqlType": "REAL" - }, - { - "Mapping": "$.price", - "Name": "price", - "SqlType": "REAL" - } - ], - "RecordEncoding": "UTF-8", - "RecordFormat": { - "RecordFormatType": "JSON" - } - }, - "KinesisFirehoseInput": { - "ResourceARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007", - "Arn" - ] - }, - "RoleARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD", - "Arn" - ] - } - }, - "NamePrefix": "SOURCE_SQL_STREAM" - } - ] - }, - "DependsOn": [ - "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF" - ] - } - }, - "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." - } - ] - } - } -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.ts deleted file mode 100644 index 1256be540..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.customLoggingBucket.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -/// !cdk-integ * -import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; -import { BucketEncryption } from "aws-cdk-lib/aws-s3"; -import { KinesisFirehoseToAnalyticsAndS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; - -const app = new App(); - -// Empty arguments -const stack = new Stack(app, generateIntegStackName(__filename)); - -new KinesisFirehoseToAnalyticsAndS3(stack, 'test-kinesisfirehose-analytics-s3', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ticker_symbol', - sqlType: 'VARCHAR(4)', - mapping: '$.ticker_symbol' - }, { - name: 'sector', - sqlType: 'VARCHAR(16)', - mapping: '$.sector' - }, { - name: 'change', - sqlType: 'REAL', - mapping: '$.change' - }, { - name: 'price', - sqlType: 'REAL', - mapping: '$.price' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - }, - loggingBucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - bucketName: 'custom-logging-bucket', - encryption: BucketEncryption.S3_MANAGED, - versioned: true - } -}); - -app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json deleted file mode 100644 index b7f3ed208..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.expected.json +++ /dev/null @@ -1,534 +0,0 @@ -{ - "Resources": { - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W35", - "reason": "This S3 bucket is used as the access logging bucket for another bucket" - } - ] - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucketPolicy2D8B2B71": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "s3:PutObject", - "Condition": { - "ArnLike": { - "aws:SourceArn": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - } - }, - "StringEquals": { - "aws:SourceAccount": { - "Ref": "AWS::AccountId" - } - } - }, - "Effect": "Allow", - "Principal": { - "Service": "logging.s3.amazonaws.com" - }, - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000", - "Arn" - ] - }, - "/*" - ] - ] - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } - ] - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3LoggingBucket887A5000" - } - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete" - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketPolicyAD03F319": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - } - ], - "Version": "2012-10-17" - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroup7E569B76": { - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" - }, - { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" - } - ] - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroupfirehoselogstream98C70102": { - "Type": "AWS::Logs::LogStream", - "Properties": { - "LogGroupName": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroup7E569B76" - } - }, - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain" - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehoseRoleE7F8ADDA": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "firehose.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehosePolicy8E134001": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:AbortMultipartUpload", - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - "s3:ListBucketMultipartUploads", - "s3:PutObject" - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "logs:PutLogEvents", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":logs:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":log-group:", - { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroup7E569B76" - }, - ":log-stream:", - { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroupfirehoselogstream98C70102" - } - ] - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehosePolicy8E134001", - "Roles": [ - { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehoseRoleE7F8ADDA" - } - ] - } - }, - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehose86F339C4": { - "Type": "AWS::KinesisFirehose::DeliveryStream", - "Properties": { - "DeliveryStreamEncryptionConfigurationInput": { - "KeyType": "AWS_OWNED_CMK" - }, - "DeliveryStreamName": "KinesisFirehosenoargumentstestfistackKinesisFirehoseToS38B072B5E", - "ExtendedS3DestinationConfiguration": { - "BucketARN": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3S3BucketAE659354", - "Arn" - ] - }, - "BufferingHints": { - "IntervalInSeconds": 300, - "SizeInMBs": 5 - }, - "CloudWatchLoggingOptions": { - "Enabled": true, - "LogGroupName": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroup7E569B76" - }, - "LogStreamName": { - "Ref": "testfirehoses3andanalyticsstackKinesisFirehoseToS3firehoseloggroupfirehoselogstream98C70102" - } - }, - "CompressionFormat": "GZIP", - "EncryptionConfiguration": { - "KMSEncryptionConfig": { - "AWSKMSKeyARN": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":kms:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":alias/aws/s3" - ] - ] - } - } - }, - "RoleARN": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehoseRoleE7F8ADDA", - "Arn" - ] - } - } - } - }, - "testfirehoses3andanalyticsstackKinesisAnalyticsRole7217C4CC": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "kinesisanalytics.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testfirehoses3andanalyticsstackKinesisAnalyticsPolicy2594304F": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "firehose:DescribeDeliveryStream", - "firehose:Get*" - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehose86F339C4", - "Arn" - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testfirehoses3andanalyticsstackKinesisAnalyticsPolicy2594304F", - "Roles": [ - { - "Ref": "testfirehoses3andanalyticsstackKinesisAnalyticsRole7217C4CC" - } - ] - } - }, - "testfirehoses3andanalyticsstackKinesisAnalytics20F3845E": { - "Type": "AWS::KinesisAnalytics::Application", - "Properties": { - "Inputs": [ - { - "InputSchema": { - "RecordColumns": [ - { - "Mapping": "$.ticker_symbol", - "Name": "ticker_symbol", - "SqlType": "VARCHAR(4)" - }, - { - "Mapping": "$.sector", - "Name": "sector", - "SqlType": "VARCHAR(16)" - }, - { - "Mapping": "$.change", - "Name": "change", - "SqlType": "REAL" - }, - { - "Mapping": "$.price", - "Name": "price", - "SqlType": "REAL" - } - ], - "RecordEncoding": "UTF-8", - "RecordFormat": { - "RecordFormatType": "JSON" - } - }, - "KinesisFirehoseInput": { - "ResourceARN": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisFirehoseToS3KinesisFirehose86F339C4", - "Arn" - ] - }, - "RoleARN": { - "Fn::GetAtt": [ - "testfirehoses3andanalyticsstackKinesisAnalyticsRole7217C4CC", - "Arn" - ] - } - }, - "NamePrefix": "SOURCE_SQL_STREAM" - } - ] - }, - "DependsOn": [ - "testfirehoses3andanalyticsstackKinesisAnalyticsPolicy2594304F" - ] - } - }, - "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." - } - ] - } - } -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.ts deleted file mode 100644 index e1d327d7d..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.no-arguments.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -// Imports -import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; -import { KinesisFirehoseToAnalyticsAndS3, KinesisFirehoseToAnalyticsAndS3Props } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; - -// Setup -const app = new App(); -const stack = new Stack(app, generateIntegStackName(__filename)); - -// Definitions -const props: KinesisFirehoseToAnalyticsAndS3Props = { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ticker_symbol', - sqlType: 'VARCHAR(4)', - mapping: '$.ticker_symbol' - }, { - name: 'sector', - sqlType: 'VARCHAR(16)', - mapping: '$.sector' - }, { - name: 'change', - sqlType: 'REAL', - mapping: '$.change' - }, { - name: 'price', - sqlType: 'REAL', - mapping: '$.price' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - } -}; - -new KinesisFirehoseToAnalyticsAndS3(stack, 'test-firehose-s3-and-analytics-stack', props); - -// Synth -app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.expected.json deleted file mode 100644 index ad316b46d..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.expected.json +++ /dev/null @@ -1,421 +0,0 @@ -{ - "Resources": { - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } - ] - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W35", - "reason": "This S3 bucket is created for unit/ integration testing purposes only." - } - ] - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketPolicy55E9C081": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F": { - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" - }, - { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" - } - ] - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2": { - "Type": "AWS::Logs::LogStream", - "Properties": { - "LogGroupName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - } - }, - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain" - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "firehose.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehosePolicy9CE17DCF": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:AbortMultipartUpload", - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - "s3:ListBucketMultipartUploads", - "s3:PutObject" - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "logs:PutLogEvents", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":logs:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":log-group:", - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - }, - ":log-stream:", - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2" - } - ] - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehosePolicy9CE17DCF", - "Roles": [ - { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC" - } - ] - } - }, - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007": { - "Type": "AWS::KinesisFirehose::DeliveryStream", - "Properties": { - "DeliveryStreamEncryptionConfigurationInput": { - "KeyType": "AWS_OWNED_CMK" - }, - "DeliveryStreamName": "KinesisFirehosenoLoggingBucketteicss3KinesisFirehoseToS3EAC1AA77", - "ExtendedS3DestinationConfiguration": { - "BucketARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3S3BucketA83D2E56", - "Arn" - ] - }, - "BufferingHints": { - "IntervalInSeconds": 300, - "SizeInMBs": 5 - }, - "CloudWatchLoggingOptions": { - "Enabled": true, - "LogGroupName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupA3650D3F" - }, - "LogStreamName": { - "Ref": "testkinesisfirehoseanalyticss3KinesisFirehoseToS3firehoseloggroupfirehoselogstream508B1DD2" - } - }, - "CompressionFormat": "GZIP", - "EncryptionConfiguration": { - "KMSEncryptionConfig": { - "AWSKMSKeyARN": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":kms:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":alias/aws/s3" - ] - ] - } - } - }, - "RoleARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehoseRoleD36244BC", - "Arn" - ] - } - } - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "kinesisanalytics.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "firehose:DescribeDeliveryStream", - "firehose:Get*" - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007", - "Arn" - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF", - "Roles": [ - { - "Ref": "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD" - } - ] - } - }, - "testkinesisfirehoseanalyticss3KinesisAnalytics0C0663D4": { - "Type": "AWS::KinesisAnalytics::Application", - "Properties": { - "Inputs": [ - { - "InputSchema": { - "RecordColumns": [ - { - "Mapping": "$.ticker_symbol", - "Name": "ticker_symbol", - "SqlType": "VARCHAR(4)" - }, - { - "Mapping": "$.sector", - "Name": "sector", - "SqlType": "VARCHAR(16)" - }, - { - "Mapping": "$.change", - "Name": "change", - "SqlType": "REAL" - }, - { - "Mapping": "$.price", - "Name": "price", - "SqlType": "REAL" - } - ], - "RecordEncoding": "UTF-8", - "RecordFormat": { - "RecordFormatType": "JSON" - } - }, - "KinesisFirehoseInput": { - "ResourceARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisFirehoseToS3KinesisFirehose9D683007", - "Arn" - ] - }, - "RoleARN": { - "Fn::GetAtt": [ - "testkinesisfirehoseanalyticss3KinesisAnalyticsRoleB66D81BD", - "Arn" - ] - } - }, - "NamePrefix": "SOURCE_SQL_STREAM" - } - ] - }, - "DependsOn": [ - "testkinesisfirehoseanalyticss3KinesisAnalyticsPolicy9CAEA1BF" - ] - } - }, - "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." - } - ] - } - } -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.ts deleted file mode 100644 index 143883d58..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/integ.noLoggingBucket.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -/// !cdk-integ * -import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; -import { KinesisFirehoseToAnalyticsAndS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; -import * as s3 from "aws-cdk-lib/aws-s3"; -import * as defaults from '@aws-solutions-constructs/core'; - -const app = new App(); - -// Empty arguments -const stack = new Stack(app, generateIntegStackName(__filename)); - -const construct = new KinesisFirehoseToAnalyticsAndS3(stack, 'test-kinesisfirehose-analytics-s3', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ticker_symbol', - sqlType: 'VARCHAR(4)', - mapping: '$.ticker_symbol' - }, { - name: 'sector', - sqlType: 'VARCHAR(16)', - mapping: '$.sector' - }, { - name: 'change', - sqlType: 'REAL', - mapping: '$.change' - }, { - name: 'price', - sqlType: 'REAL', - mapping: '$.price' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - }, - logS3AccessLogs: false -}); - -const s3Bucket = construct.s3Bucket as s3.Bucket; - -defaults.addCfnSuppressRules(s3Bucket, [ - { id: 'W35', - reason: 'This S3 bucket is created for unit/ integration testing purposes only.' }, -]); - -app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts deleted file mode 100644 index 89adcdd84..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/kinesisfirehose-s3-and-kinesisanalytics.test.ts +++ /dev/null @@ -1,215 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -// Imports -import { Stack, RemovalPolicy } from 'aws-cdk-lib'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import { KinesisFirehoseToAnalyticsAndS3, KinesisFirehoseToAnalyticsAndS3Props } from '../lib'; -import { Template } from 'aws-cdk-lib/assertions'; - -// -------------------------------------------------------------- -// Test Case 2 - Test the getter methods -// -------------------------------------------------------------- -test('Test properties', () => { - // Initial Setup - const stack = new Stack(); - const props: KinesisFirehoseToAnalyticsAndS3Props = { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ts', - sqlType: 'TIMESTAMP', - mapping: '$.timestamp' - }, { - name: 'trip_id', - sqlType: 'VARCHAR(64)', - mapping: '$.trip_id' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - } - }; - const app = new KinesisFirehoseToAnalyticsAndS3(stack, 'test-kinesis-firehose-kinesis-analytics', props); - // Assertions - expect(app.kinesisAnalytics).toBeDefined(); - expect(app.kinesisFirehose).toBeDefined(); - expect(app.kinesisFirehoseRole).toBeDefined(); - expect(app.kinesisFirehoseLogGroup).toBeDefined(); - expect(app.s3Bucket).toBeDefined(); - expect(app.s3LoggingBucket).toBeDefined(); -}); - -// -------------------------------------------------------------- -// Test Case 3 - Override kinesisFirehose props -// -------------------------------------------------------------- -test('test kinesisFirehose override ', () => { - const stack = new Stack(); - - new KinesisFirehoseToAnalyticsAndS3(stack, 'test-firehose-s3', { - kinesisFirehoseProps: { - extendedS3DestinationConfiguration: { - bufferingHints: { - intervalInSeconds: 600, - sizeInMBs: 55 - }, - } - }, - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ts', - sqlType: 'TIMESTAMP', - mapping: '$.timestamp' - }, { - name: 'trip_id', - sqlType: 'VARCHAR(64)', - mapping: '$.trip_id' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - } - }); - - const template = Template.fromStack(stack); - template.hasResourceProperties("AWS::KinesisFirehose::DeliveryStream", { - ExtendedS3DestinationConfiguration: { - BufferingHints: { - IntervalInSeconds: 600, - SizeInMBs: 55 - } - } - }); -}); - -// -------------------------------------------------------------- -// Test bad call with existingBucket and bucketProps -// -------------------------------------------------------------- -test("Confirm CheckS3Props is being called", () => { - // Stack - const stack = new Stack(); - - const testBucket = new s3.Bucket(stack, 'test-bucket', {}); - - const app = () => { - // Helper declaration - new KinesisFirehoseToAnalyticsAndS3(stack, "bad-s3-args", { - existingBucketObj: testBucket, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY - }, - }); - }; - // Assertion - expect(app).toThrowError("Error - Either provide bucketProps or existingBucketObj, but not both.\n"); -}); - -// -------------------------------------------------------------- -// s3 bucket with bucket, loggingBucket, and auto delete objects -// -------------------------------------------------------------- -test('s3 bucket with bucket, loggingBucket, and auto delete objects', () => { - const stack = new Stack(); - - new KinesisFirehoseToAnalyticsAndS3(stack, 'kinsisfirehose-s3-analytics', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ts', - sqlType: 'TIMESTAMP', - mapping: '$.timestamp' - }, { - name: 'trip_id', - sqlType: 'VARCHAR(64)', - mapping: '$.trip_id' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - loggingBucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - autoDeleteObjects: true - } - }); - - const template = Template.fromStack(stack); - template.resourceCountIs("AWS::S3::Bucket", 2); - - template.hasResourceProperties("Custom::S3AutoDeleteObjects", { - ServiceToken: { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn" - ] - }, - BucketName: { - Ref: "kinsisfirehoses3analyticsKinesisFirehoseToS3S3LoggingBucket6EE455EF" - } - }); -}); - -// -------------------------------------------------------------- -// s3 bucket with one content bucket and no logging bucket -// -------------------------------------------------------------- -test('s3 bucket with one content bucket and no logging bucket', () => { - const stack = new Stack(); - - new KinesisFirehoseToAnalyticsAndS3(stack, 'kinsisfirehose-s3-analytics', { - kinesisAnalyticsProps: { - inputs: [{ - inputSchema: { - recordColumns: [{ - name: 'ts', - sqlType: 'TIMESTAMP', - mapping: '$.timestamp' - }, { - name: 'trip_id', - sqlType: 'VARCHAR(64)', - mapping: '$.trip_id' - }], - recordFormat: { - recordFormatType: 'JSON' - }, - recordEncoding: 'UTF-8' - }, - namePrefix: 'SOURCE_SQL_STREAM' - }] - }, - kinesisFirehoseProps: { - deliveryStreamType: 'KinesisStreamAsSource' - }, - bucketProps: { - removalPolicy: RemovalPolicy.DESTROY, - }, - logS3AccessLogs: false - }); - - const template = Template.fromStack(stack); - template.resourceCountIs("AWS::S3::Bucket", 1); -}); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/lambda/index.js b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/lambda/index.js deleted file mode 100644 index 5844e65a2..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3-and-kinesisanalytics/test/lambda/index.js +++ /dev/null @@ -1,8 +0,0 @@ -exports.handler = async function(event) { - console.log('request:', JSON.stringify(event, undefined, 2)); - return { - statusCode: 200, - headers: { 'Content-Type': 'text/plain' }, - body: `//stub//` - }; - }; \ No newline at end of file From 9da706586cf6cceb9bf4eba3cb9332003af195e0 Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 6 Nov 2023 21:40:20 -0500 Subject: [PATCH 60/73] fix(aws-eventbridge-sns): long sns topic names break eventbridge bindings (#1024) * Explicitly set event schedule binding to Topic * Remove .only tag from test --- .../aws-eventbridge-sns/lib/index.ts | 15 +- .../test/eventbridge-sns-topic.test.ts | 21 +- .../test/integ.exist-bus.expected.json | 25 +- .../test/integ.long-stack-name.expected.json | 418 ++++++++++++++++++ .../test/integ.long-stack-name.ts | 32 ++ .../test/integ.new-bus.expected.json | 25 +- .../test/integ.no-arg.expected.json | 25 +- ...integ.second-long-stack-name.expected.json | 418 ++++++++++++++++++ .../test/integ.second-long-stack-name.ts | 38 ++ 9 files changed, 998 insertions(+), 19 deletions(-) create mode 100644 source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.ts create mode 100644 source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.expected.json create mode 100644 source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts index 16f117634..ec101f64c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/lib/index.ts @@ -15,6 +15,7 @@ import * as sns from 'aws-cdk-lib/aws-sns'; import * as events from 'aws-cdk-lib/aws-events'; import * as kms from 'aws-cdk-lib/aws-kms'; import * as defaults from '@aws-solutions-constructs/core'; +import * as cdk from 'aws-cdk-lib'; // Note: To ensure CDKv2 compatibility, keep the import statement for Construct separate import { Construct } from 'constructs'; import { overrideProps } from '@aws-solutions-constructs/core'; @@ -107,10 +108,22 @@ export class EventbridgeToSns extends Construct { this.snsTopic = buildTopicResponse.topic; this.encryptionKey = buildTopicResponse.key; + // Setup the event rule target as sns topic. + + // The CDK generally avoids resource names that are too long, but in this case the maximum SNS topic name is 256 characters and the maximum + // binding id is 64 characters, so a long SNS topic name (driven by Stack id, Construct id, etc.) breaks upon launch. Because of this, we take + // control of the physical name ourselves. + const maxBindingIdLength = 64; + const nameParts: string[] = [ + cdk.Stack.of(scope).stackName, // Name of the stack + id, // Construct ID + ]; + const generatedTopicName = defaults.generatePhysicalName("", nameParts, maxBindingIdLength); + const topicEventTarget: events.IRuleTarget = { bind: () => ({ - id: this.snsTopic.topicName, + id: generatedTopicName, arn: this.snsTopic.topicArn }) }; diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts index 7e967141a..3df78779a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/eventbridge-sns-topic.test.ts @@ -155,9 +155,24 @@ test('check events rule properties', () => { Ref: "testSnsTopic42942701" }, Id: { - "Fn::GetAtt": [ - "testSnsTopic42942701", - "TopicName" + "Fn::Join": [ + "", + [ + "Defaulttest-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + Ref: "AWS::StackId" + } + ] + } + ] + } + ] ] } } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.exist-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.exist-bus.expected.json index 99754ff5c..60a6796d3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.exist-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.exist-bus.expected.json @@ -9,6 +9,7 @@ "testconstructEncryptionKey6153B053": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -49,8 +50,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -179,9 +179,24 @@ "Ref": "testconstructSnsTopic44188529" }, "Id": { - "Fn::GetAtt": [ - "testconstructSnsTopic44188529", - "TopicName" + "Fn::Join": [ + "", + [ + "exist-bustest-construct-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] ] } } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.expected.json new file mode 100644 index 000000000..2ead5278a --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.expected.json @@ -0,0 +1,418 @@ +{ + "Resources": { + "testconstructEncryptionKey6153B053": { + "Type": "AWS::KMS::Key", + "Properties": { + "EnableKeyRotation": true, + "KeyPolicy": { + "Statement": [ + { + "Action": "kms:*", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": "*" + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*" + ], + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + }, + "Resource": "*" + } + ], + "Version": "2012-10-17" + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "testconstructSnsTopic44188529": { + "Type": "AWS::SNS::Topic", + "Properties": { + "KmsMasterKeyId": { + "Fn::GetAtt": [ + "testconstructEncryptionKey6153B053", + "Arn" + ] + } + } + }, + "testconstructSnsTopicPolicy72FFD530": { + "Type": "AWS::SNS::TopicPolicy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "SNS:Publish", + "SNS:RemovePermission", + "SNS:SetTopicAttributes", + "SNS:DeleteTopic", + "SNS:ListSubscriptionsByTopic", + "SNS:GetTopicAttributes", + "SNS:Receive", + "SNS:AddPermission", + "SNS:Subscribe" + ], + "Condition": { + "StringEquals": { + "AWS:SourceOwner": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": { + "Ref": "testconstructSnsTopic44188529" + }, + "Sid": "TopicOwnerOnlyAccess" + }, + { + "Action": [ + "SNS:Publish", + "SNS:RemovePermission", + "SNS:SetTopicAttributes", + "SNS:DeleteTopic", + "SNS:ListSubscriptionsByTopic", + "SNS:GetTopicAttributes", + "SNS:Receive", + "SNS:AddPermission", + "SNS:Subscribe" + ], + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": { + "Ref": "testconstructSnsTopic44188529" + }, + "Sid": "HttpsOnly" + }, + { + "Action": "sns:Publish", + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + }, + "Resource": { + "Ref": "testconstructSnsTopic44188529" + }, + "Sid": "2" + } + ], + "Version": "2012-10-17" + }, + "Topics": [ + { + "Ref": "testconstructSnsTopic44188529" + } + ] + } + }, + "testconstructEventsRule145DBA20": { + "Type": "AWS::Events::Rule", + "Properties": { + "ScheduleExpression": "rate(1 minute)", + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Ref": "testconstructSnsTopic44188529" + }, + "Id": { + "Fn::Join": [ + "", + [ + "longstacknametest-construct-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } + } + ] + } + }, + "secondconstructEncryptionKey6A63A25A": { + "Type": "AWS::KMS::Key", + "Properties": { + "EnableKeyRotation": true, + "KeyPolicy": { + "Statement": [ + { + "Action": "kms:*", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": "*" + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*" + ], + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + }, + "Resource": "*" + } + ], + "Version": "2012-10-17" + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "secondconstructSnsTopicCE75056B": { + "Type": "AWS::SNS::Topic", + "Properties": { + "KmsMasterKeyId": { + "Fn::GetAtt": [ + "secondconstructEncryptionKey6A63A25A", + "Arn" + ] + } + } + }, + "secondconstructSnsTopicPolicyD6D4DA55": { + "Type": "AWS::SNS::TopicPolicy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "SNS:Publish", + "SNS:RemovePermission", + "SNS:SetTopicAttributes", + "SNS:DeleteTopic", + "SNS:ListSubscriptionsByTopic", + "SNS:GetTopicAttributes", + "SNS:Receive", + "SNS:AddPermission", + "SNS:Subscribe" + ], + "Condition": { + "StringEquals": { + "AWS:SourceOwner": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": { + "Ref": "secondconstructSnsTopicCE75056B" + }, + "Sid": "TopicOwnerOnlyAccess" + }, + { + "Action": [ + "SNS:Publish", + "SNS:RemovePermission", + "SNS:SetTopicAttributes", + "SNS:DeleteTopic", + "SNS:ListSubscriptionsByTopic", + "SNS:GetTopicAttributes", + "SNS:Receive", + "SNS:AddPermission", + "SNS:Subscribe" + ], + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": { + "Ref": "secondconstructSnsTopicCE75056B" + }, + "Sid": "HttpsOnly" + }, + { + "Action": "sns:Publish", + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + }, + "Resource": { + "Ref": "secondconstructSnsTopicCE75056B" + }, + "Sid": "2" + } + ], + "Version": "2012-10-17" + }, + "Topics": [ + { + "Ref": "secondconstructSnsTopicCE75056B" + } + ] + } + }, + "secondconstructEventsRuleFA5C1CE6": { + "Type": "AWS::Events::Rule", + "Properties": { + "ScheduleExpression": "rate(1 minute)", + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Ref": "secondconstructSnsTopicCE75056B" + }, + "Id": { + "Fn::Join": [ + "", + [ + "longstacknamecond-construct-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } + } + ] + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.ts new file mode 100644 index 000000000..6bbb3f4e9 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.ts @@ -0,0 +1,32 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { Duration } from 'aws-cdk-lib'; +import { EventbridgeToSns, EventbridgeToSnsProps } from '../lib'; +import * as events from 'aws-cdk-lib/aws-events'; +import { App, Stack } from 'aws-cdk-lib'; +import { generateIntegStackName } from '@aws-solutions-constructs/core'; + +const app = new App(); +const stack = new Stack(app, generateIntegStackName(__filename) + 'ThisIsTheLongestNameForAStackItMustBeGreaterThanSixtyFourCharactersLongAndThisShouldJustAboutDoItNoItMustBeABitLonger'); + +const props: EventbridgeToSnsProps = { + eventRuleProps: { + schedule: events.Schedule.rate(Duration.minutes(1)) + } +}; + +new EventbridgeToSns(stack, 'test-construct', props); +new EventbridgeToSns(stack, 'second-construct', props); + +app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.new-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.new-bus.expected.json index a009ae1f9..1a5cd3a19 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.new-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.new-bus.expected.json @@ -3,6 +3,7 @@ "testconstructEncryptionKey6153B053": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -43,8 +44,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -179,9 +179,24 @@ "Ref": "testconstructSnsTopic44188529" }, "Id": { - "Fn::GetAtt": [ - "testconstructSnsTopic44188529", - "TopicName" + "Fn::Join": [ + "", + [ + "new-bustest-construct-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] ] } } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.no-arg.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.no-arg.expected.json index 1b036dafb..15096fe48 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.no-arg.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.no-arg.expected.json @@ -3,6 +3,7 @@ "testconstructEncryptionKey6153B053": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -43,8 +44,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -166,9 +166,24 @@ "Ref": "testconstructSnsTopic44188529" }, "Id": { - "Fn::GetAtt": [ - "testconstructSnsTopic44188529", - "TopicName" + "Fn::Join": [ + "", + [ + "no-argtest-construct-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] ] } } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.expected.json new file mode 100644 index 000000000..61fcb4f5b --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.expected.json @@ -0,0 +1,418 @@ +{ + "Resources": { + "testconstructEncryptionKey6153B053": { + "Type": "AWS::KMS::Key", + "Properties": { + "EnableKeyRotation": true, + "KeyPolicy": { + "Statement": [ + { + "Action": "kms:*", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": "*" + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*" + ], + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + }, + "Resource": "*" + } + ], + "Version": "2012-10-17" + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "testconstructSnsTopic44188529": { + "Type": "AWS::SNS::Topic", + "Properties": { + "KmsMasterKeyId": { + "Fn::GetAtt": [ + "testconstructEncryptionKey6153B053", + "Arn" + ] + } + } + }, + "testconstructSnsTopicPolicy72FFD530": { + "Type": "AWS::SNS::TopicPolicy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "SNS:Publish", + "SNS:RemovePermission", + "SNS:SetTopicAttributes", + "SNS:DeleteTopic", + "SNS:ListSubscriptionsByTopic", + "SNS:GetTopicAttributes", + "SNS:Receive", + "SNS:AddPermission", + "SNS:Subscribe" + ], + "Condition": { + "StringEquals": { + "AWS:SourceOwner": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": { + "Ref": "testconstructSnsTopic44188529" + }, + "Sid": "TopicOwnerOnlyAccess" + }, + { + "Action": [ + "SNS:Publish", + "SNS:RemovePermission", + "SNS:SetTopicAttributes", + "SNS:DeleteTopic", + "SNS:ListSubscriptionsByTopic", + "SNS:GetTopicAttributes", + "SNS:Receive", + "SNS:AddPermission", + "SNS:Subscribe" + ], + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": { + "Ref": "testconstructSnsTopic44188529" + }, + "Sid": "HttpsOnly" + }, + { + "Action": "sns:Publish", + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + }, + "Resource": { + "Ref": "testconstructSnsTopic44188529" + }, + "Sid": "2" + } + ], + "Version": "2012-10-17" + }, + "Topics": [ + { + "Ref": "testconstructSnsTopic44188529" + } + ] + } + }, + "testconstructEventsRule145DBA20": { + "Type": "AWS::Events::Rule", + "Properties": { + "ScheduleExpression": "rate(1 minute)", + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Ref": "testconstructSnsTopic44188529" + }, + "Id": { + "Fn::Join": [ + "", + [ + "secondlongstatest-construct-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } + } + ] + } + }, + "secondconstructEncryptionKey6A63A25A": { + "Type": "AWS::KMS::Key", + "Properties": { + "EnableKeyRotation": true, + "KeyPolicy": { + "Statement": [ + { + "Action": "kms:*", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": "*" + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*" + ], + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + }, + "Resource": "*" + } + ], + "Version": "2012-10-17" + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "secondconstructSnsTopicCE75056B": { + "Type": "AWS::SNS::Topic", + "Properties": { + "KmsMasterKeyId": { + "Fn::GetAtt": [ + "secondconstructEncryptionKey6A63A25A", + "Arn" + ] + } + } + }, + "secondconstructSnsTopicPolicyD6D4DA55": { + "Type": "AWS::SNS::TopicPolicy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "SNS:Publish", + "SNS:RemovePermission", + "SNS:SetTopicAttributes", + "SNS:DeleteTopic", + "SNS:ListSubscriptionsByTopic", + "SNS:GetTopicAttributes", + "SNS:Receive", + "SNS:AddPermission", + "SNS:Subscribe" + ], + "Condition": { + "StringEquals": { + "AWS:SourceOwner": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": { + "Ref": "secondconstructSnsTopicCE75056B" + }, + "Sid": "TopicOwnerOnlyAccess" + }, + { + "Action": [ + "SNS:Publish", + "SNS:RemovePermission", + "SNS:SetTopicAttributes", + "SNS:DeleteTopic", + "SNS:ListSubscriptionsByTopic", + "SNS:GetTopicAttributes", + "SNS:Receive", + "SNS:AddPermission", + "SNS:Subscribe" + ], + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": { + "Ref": "secondconstructSnsTopicCE75056B" + }, + "Sid": "HttpsOnly" + }, + { + "Action": "sns:Publish", + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + }, + "Resource": { + "Ref": "secondconstructSnsTopicCE75056B" + }, + "Sid": "2" + } + ], + "Version": "2012-10-17" + }, + "Topics": [ + { + "Ref": "secondconstructSnsTopicCE75056B" + } + ] + } + }, + "secondconstructEventsRuleFA5C1CE6": { + "Type": "AWS::Events::Rule", + "Properties": { + "ScheduleExpression": "rate(1 minute)", + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Ref": "secondconstructSnsTopicCE75056B" + }, + "Id": { + "Fn::Join": [ + "", + [ + "secondlongstacond-construct-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } + } + ] + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.ts new file mode 100644 index 000000000..0e6fc2f23 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.ts @@ -0,0 +1,38 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +// In order to confirm that we avoid name collisions on the event binding with both multiple constructs and multiple stacks, +// launch two stacks with two constructs at the same time using +// cdk-integ integ.second-long-stack-name.js integ.long-stack-name.js --no-clean +// and confirm that all topics are publishing messages. + +import { Duration } from 'aws-cdk-lib'; +import { EventbridgeToSns, EventbridgeToSnsProps } from '../lib'; +import * as events from 'aws-cdk-lib/aws-events'; +import { App, Stack } from 'aws-cdk-lib'; +import { generateIntegStackName } from '@aws-solutions-constructs/core'; + +const app = new App(); + +const stackTwo = new Stack(app, generateIntegStackName(__filename) + 'ThisIsTheLongestNameForAStackItMustBeGreaterThanSixtyFourCharactersLongAndThisShouldJustAboutDoItNoItMustBeABitLessShort'); + +const propsTwo: EventbridgeToSnsProps = { + eventRuleProps: { + schedule: events.Schedule.rate(Duration.minutes(1)) + } +}; + +new EventbridgeToSns(stackTwo, 'test-construct', propsTwo); +new EventbridgeToSns(stackTwo, 'second-construct', propsTwo); + +app.synth(); \ No newline at end of file From f24161a5c77e08a544df6373c50aacadf9661ea3 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Thu, 9 Nov 2023 15:23:22 +0000 Subject: [PATCH 61/73] chore(release): 2.46.0 --- CHANGELOG.md | 7 +++++++ source/lerna.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09cecc0a0..3ccb74ec2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.46.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.45.0...v2.46.0) (2023-11-09) + + +### Bug Fixes + +* **aws-eventbridge-sns:** long sns topic names break eventbridge bindings ([#1024](https://github.com/awslabs/aws-solutions-constructs/issues/1024)) ([9da7065](https://github.com/awslabs/aws-solutions-constructs/commit/9da706586cf6cceb9bf4eba3cb9332003af195e0)) + ## [2.45.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.44.0...v2.45.0) (2023-10-14) Built on CDK v2.99.1 diff --git a/source/lerna.json b/source/lerna.json index 189481e63..9c5ad553a 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.45.0" + "version": "2.46.0" } From c1323a0fbd27acb252f172fdc17e9de134cbe41d Mon Sep 17 00:00:00 2001 From: biffgaut Date: Thu, 9 Nov 2023 10:28:00 -0500 Subject: [PATCH 62/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ccb74ec2..3d4be23dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,13 +11,15 @@ All notable changes to this project will be documented in this file. See [standa ## [2.45.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.44.0...v2.45.0) (2023-10-14) -Built on CDK v2.99.1 +Built on CDK v2.105.0 Significant internal clean up chores ### Bug Fixes * **all:** typos ([#1010](https://github.com/awslabs/aws-solutions-constructs/issues/1010)) ([0787baf](https://github.com/awslabs/aws-solutions-constructs/commit/0787baf7c68f84599139e5b886d5942b076174f2)) +* **aws-eventbridge-sns:** long sns topic names break eventbridge bindings ([#1024](https://github.com/awslabs/aws-solutions-constructs/issues/1024)) + ## [2.44.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.43.0...v2.44.0) (2023-08-29) Built on CDK v2.82.0 (no new features, just internal housekeeping) From 822c7b2fae22b17b82e23d50813b3448412d7d65 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Thu, 9 Nov 2023 10:28:01 -0500 Subject: [PATCH 63/73] chore(version): Upgraded CDK --- deployment/v2/align-version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v2/align-version.js b/deployment/v2/align-version.js index 7650ba383..cd4a923e5 100755 --- a/deployment/v2/align-version.js +++ b/deployment/v2/align-version.js @@ -10,7 +10,7 @@ const findVersion = process.argv[2]; const replaceVersion = process.argv[3]; // these versions need to be sourced from a config file -const awsCdkLibVersion = '2.99.1'; +const awsCdkLibVersion = '2.105.0'; const constructsVersion = '10.0.0'; const MODULE_EXEMPTIONS = new Set([ '@aws-cdk/cloudformation-diff', From eb622e0da60f609e0dc1aca6f631a43a2e422e21 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 12 Nov 2023 20:22:40 -0500 Subject: [PATCH 64/73] Update tests for CDK version; simultaneous launch --- ...r-all-existing-private-http.expected.json} | 66 ++--- ...integ.albfar-all-existing-private-http.ts} | 0 ....albfar-all-new-public-http.expected.json} | 69 ++--- ...ts => integ.albfar-all-new-public-http.ts} | 0 ....albfar-all-new-two-targets.expected.json} | 73 ++--- ...ts => integ.albfar-all-new-two-targets.ts} | 0 ...privateApiExistingResources.expected.json} | 53 ++-- ...teg.alblam-privateApiExistingResources.ts} | 0 ...blam-privateApiNewResources.expected.json} | 27 +- ...=> integ.alblam-privateApiNewResources.ts} | 0 ...-publicApiExistingResources.expected.json} | 53 ++-- ...nteg.alblam-publicApiExistingResources.ts} | 0 ...lblam-publicApiNewResources.expected.json} | 53 ++-- ... => integ.alblam-publicApiNewResources.ts} | 0 ... => integ.alblam-twoTargets.expected.json} | 55 ++-- ...oTargets.ts => integ.alblam-twoTargets.ts} | 0 ...plates-custom-resource-name.expected.json} | 42 +-- ...request-templates-custom-resource-name.ts} | 0 ...dditional-request-templates.expected.json} | 38 +-- ...eg.apiddb-additional-request-templates.ts} | 0 ...db-apigateway-dynamodb-CRUD.expected.json} | 92 +++---- ... integ.apiddb-apigateway-dynamodb-CRUD.ts} | 0 ...way-dynamodb-existing-table.expected.json} | 38 +-- ...ddb-apigateway-dynamodb-existing-table.ts} | 0 ...ustom-integration-responses.expected.json} | 38 +-- ...eg.apiddb-custom-integration-responses.ts} | 0 ...> integ.apiddb-no-arguments.expected.json} | 38 +-- ...uments.ts => integ.apiddb-no-arguments.ts} | 0 ... integ.apiiot-defaultParams.expected.json} | 138 +++++----- ...arams.ts => integ.apiiot-defaultParams.ts} | 0 ...integ.apiiot-overrideParams.expected.json} | 140 +++++----- ...rams.ts => integ.apiiot-overrideParams.ts} | 0 ...iiot-override_auth_api_keys.expected.json} | 140 +++++----- ...=> integ.apiiot-override_auth_api_keys.ts} | 0 ...dditional-request-templates.expected.json} | 58 ++-- ...eg.apikin-additional-request-templates.ts} | 0 ...pigateway-kinesis-overwrite.expected.json} | 50 ++-- ...eg.apikin-apigateway-kinesis-overwrite.ts} | 0 ...ustom-integration-responses.expected.json} | 58 ++-- ...eg.apikin-custom-integration-responses.ts} | 0 ...> integ.apikin-no-arguments.expected.json} | 58 ++-- ...uments.ts => integ.apikin-no-arguments.ts} | 0 ...integ.apilam-deployFunction.expected.json} | 66 ++--- ...tion.ts => integ.apilam-deployFunction.ts} | 0 ...teg.apilam-existingFunction.expected.json} | 66 ++--- ...on.ts => integ.apilam-existingFunction.ts} | 0 ...dditional-request-templates.expected.json} | 28 +- ...eg.apisag-additional-request-templates.ts} | 0 ...sagemakerendpoint-overwrite.expected.json} | 28 +- ...apigateway-sagemakerendpoint-overwrite.ts} | 0 ...> integ.apisag-no-overwrite.expected.json} | 28 +- ...rwrite.ts => integ.apisag-no-overwrite.ts} | 0 ...dditional-request-templates.expected.json} | 50 ++-- ...eg.apisqs-additional-request-templates.ts} | 0 ....apisqs-apigateway-sqs-crud.expected.json} | 66 ++--- ...ts => integ.apisqs-apigateway-sqs-crud.ts} | 0 ...ustom-integration-responses.expected.json} | 34 +-- ...eg.apisqs-custom-integration-responses.ts} | 0 ...integ.apisqs-existing-queue.expected.json} | 34 +-- ...ueue.ts => integ.apisqs-existing-queue.ts} | 0 ...> integ.apisqs-no-arguments.expected.json} | 34 +-- ...uments.ts => integ.apisqs-no-arguments.ts} | 0 ...stomCloudfrontLoggingBucket.expected.json} | 79 +++--- ...cftaplam-customCloudfrontLoggingBucket.ts} | 0 ...integ.cftaplam-no-arguments.expected.json} | 79 +++--- ...ents.ts => integ.cftaplam-no-arguments.ts} | 0 ....cftaplam-override-behavior.expected.json} | 71 ++--- ...ts => integ.cftaplam-override-behavior.ts} | 0 ...stomCloudfrontLoggingBucket.expected.json} | 79 +++--- ...g.cftapi-customCloudfrontLoggingBucket.ts} | 0 ...> integ.cftapi-no-arguments.expected.json} | 79 +++--- ...uments.ts => integ.cftapi-no-arguments.ts} | 0 ...stomCloudFrontLoggingBucket.expected.json} | 15 +- ...g.cftmed-customCloudFrontLoggingBucket.ts} | 0 ...son => integ.cftmed-default.expected.json} | 15 +- ...teg.default.ts => integ.cftmed-default.ts} | 0 ...eg.cftmed-existingContainer.expected.json} | 13 +- ...r.ts => integ.cftmed-existingContainer.ts} | 0 ...g.cftmed-overrideProperties.expected.json} | 15 +- ....ts => integ.cftmed-overrideProperties.ts} | 0 ...-withSecurityHeaderBehavior.expected.json} | 8 +- ...nteg.cftmed-withSecurityHeaderBehavior.ts} | 0 ...-withoutHttpSecurityHeaders.expected.json} | 9 +- ...nteg.cftmed-withoutHttpSecurityHeaders.ts} | 0 ... integ.cfts3-custom-headers.expected.json} | 24 +- ...aders.ts => integ.cfts3-custom-headers.ts} | 0 ...teg.cfts3-custom-originPath.expected.json} | 16 +- ...th.ts => integ.cfts3-custom-originPath.ts} | 0 ...stomCloudFrontLoggingBucket.expected.json} | 16 +- ...eg.cfts3-customCloudFrontLoggingBucket.ts} | 0 ...g.cfts3-customLoggingBucket.expected.json} | 17 +- ....ts => integ.cfts3-customLoggingBucket.ts} | 0 ...integ.cfts3-existing-bucket.expected.json} | 22 +- ...cket.ts => integ.cfts3-existing-bucket.ts} | 0 ...=> integ.cfts3-no-arguments.expected.json} | 16 +- ...guments.ts => integ.cfts3-no-arguments.ts} | 0 ...g.cfts3-no-security-headers.expected.json} | 10 +- ....ts => integ.cfts3-no-security-headers.ts} | 0 ...nteg.cogapilam-no-arguments.expected.json} | 8 +- ...nts.ts => integ.cogapilam-no-arguments.ts} | 0 ...g.dbslamels-deploy-with-vpc.expected.json} | 34 +-- ....ts => integ.dbslamels-deploy-with-vpc.ts} | 4 +- ...nteg.dbslamels-no-arguments.expected.json} | 12 +- ...nts.ts => integ.dbslamels-no-arguments.ts} | 4 +- ...integ.dbslam-existing-table.expected.json} | 30 +-- ...able.ts => integ.dbslam-existing-table.ts} | 0 ...> integ.dbslam-no-arguments.expected.json} | 30 +-- ...uments.ts => integ.dbslam-no-arguments.ts} | 0 ...vtfhss3-customLoggingBucket.expected.json} | 124 ++++++++- ... => integ.evtfhss3-customLoggingBucket.ts} | 1 + ...rehose-s3-existing-eventbus.expected.json} | 2 +- ...e-kinesisfirehose-s3-existing-eventbus.ts} | 0 ...sisfirehose-s3-new-eventbus.expected.json} | 2 +- ...bridge-kinesisfirehose-s3-new-eventbus.ts} | 0 ...sisfirehose-s3-no-arguments.expected.json} | 2 +- ...bridge-kinesisfirehose-s3-no-arguments.ts} | 0 ...fhss3-existingLoggingBucket.expected.json} | 5 +- ...> integ.evtfhss3-existingLoggingBucket.ts} | 0 ...isstreams-existing-eventbus.expected.json} | 4 +- ...ridge-kinesisstreams-existing-eventbus.ts} | 0 ...dge-kinesisstreams-existing.expected.json} | 4 +- ...in-eventbridge-kinesisstreams-existing.ts} | 0 ...kinesisstreams-new-eventbus.expected.json} | 4 +- ...ventbridge-kinesisstreams-new-eventbus.ts} | 0 ...kinesisstreams-no-arguments.expected.json} | 4 +- ...ventbridge-kinesisstreams-no-arguments.ts} | 0 ...entbridge-existing-eventbus.expected.json} | 0 ...g.evtlam-eventbridge-existing-eventbus.ts} | 0 ...am-eventbridge-new-eventbus.expected.json} | 0 ... integ.evtlam-eventbridge-new-eventbus.ts} | 0 ...lam-eventbridge-no-argument.expected.json} | 0 ...> integ.evtlam-eventbridge-no-argument.ts} | 0 ...n => integ.evtsns-exist-bus.expected.json} | 2 +- ...exist-bus.ts => integ.evtsns-exist-bus.ts} | 0 ...nteg.evtsns-long-stack-name.expected.json} | 4 +- ...ame.ts => integ.evtsns-long-stack-name.ts} | 0 ...son => integ.evtsns-new-bus.expected.json} | 2 +- ...teg.new-bus.ts => integ.evtsns-new-bus.ts} | 0 ...json => integ.evtsns-no-arg.expected.json} | 2 +- ...integ.no-arg.ts => integ.evtsns-no-arg.ts} | 0 ...tsns-second-long-stack-name.expected.json} | 4 +- ...=> integ.evtsns-second-long-stack-name.ts} | 0 ...n => integ.evtsqs-exist-bus.expected.json} | 4 +- ...exist-bus.ts => integ.evtsqs-exist-bus.ts} | 0 ...=> integ.evtsqs-exist-queue.expected.json} | 4 +- ...t-queue.ts => integ.evtsqs-exist-queue.ts} | 0 ...son => integ.evtsqs-new-bus.expected.json} | 4 +- ...teg.new-bus.ts => integ.evtsqs-new-bus.ts} | 0 ...json => integ.evtsqs-no-arg.expected.json} | 4 +- ...integ.no-arg.ts => integ.evtsqs-no-arg.ts} | 0 ...functions-existing-eventbus.expected.json} | 0 ...bridge-stepfunctions-existing-eventbus.ts} | 0 ...-stepfunctions-new-eventbus.expected.json} | 0 ...eventbridge-stepfunctions-new-eventbus.ts} | 0 ...e-stepfunctions-no-argument.expected.json} | 2 +- ...-eventbridge-stepfunctions-no-argument.ts} | 0 ...e-stepfunctions-with-lambda.expected.json} | 0 ...-eventbridge-stepfunctions-with-lambda.ts} | 0 ...g.farddb-existing-resources.expected.json} | 60 ++--- ....ts => integ.farddb-existing-resources.ts} | 0 ... integ.farddb-new-resources.expected.json} | 60 ++--- ...urces.ts => integ.farddb-new-resources.ts} | 0 ...g.farevt-existing-resources.expected.json} | 66 ++--- ....ts => integ.farevt-existing-resources.ts} | 0 ... integ.farevt-new-resources.expected.json} | 66 ++--- ...urces.ts => integ.farevt-new-resources.ts} | 0 ...rfhs-existingFargateService.expected.json} | 74 ++--- ...=> integ.farfhs-existingFargateService.ts} | 0 ...=> integ.farfhs-existingVpc.expected.json} | 74 ++--- ...tingVpc.ts => integ.farfhs-existingVpc.ts} | 0 ...fhs-fargateServiceFromProps.expected.json} | 74 ++--- ...> integ.farfhs-fargateServiceFromProps.ts} | 0 ...=> integ.farfhs-noArguments.expected.json} | 74 ++--- ...guments.ts => integ.farfhs-noArguments.ts} | 0 ...> integ.farfhs-vpcFromprops.expected.json} | 74 ++--- ...mprops.ts => integ.farfhs-vpcFromprops.ts} | 0 ...rkin-existingFargateService.expected.json} | 66 ++--- ...=> integ.farkin-existingFargateService.ts} | 0 ...integ.farkin-existingStream.expected.json} | 66 ++--- ...ream.ts => integ.farkin-existingStream.ts} | 0 ...=> integ.farkin-existingVpc.expected.json} | 66 ++--- ...tingVpc.ts => integ.farkin-existingVpc.ts} | 0 ...kin-fargateServiceFromProps.expected.json} | 66 ++--- ...> integ.farkin-fargateServiceFromProps.ts} | 0 ...=> integ.farkin-noArguments.expected.json} | 66 ++--- ...guments.ts => integ.farkin-noArguments.ts} | 0 ...nteg.farkin-streamFromProps.expected.json} | 66 ++--- ...ops.ts => integ.farkin-streamFromProps.ts} | 0 ...> integ.farkin-vpcFromProps.expected.json} | 66 ++--- ...mProps.ts => integ.farkin-vpcFromProps.ts} | 0 ...g.faropn-existing-resources.expected.json} | 60 ++--- ....ts => integ.faropn-existing-resources.ts} | 0 ... integ.faropn-new-resources.expected.json} | 70 ++--- ...urces.ts => integ.faropn-new-resources.ts} | 2 +- ...eg.fars3-existing-resources.expected.json} | 63 ++--- ...s.ts => integ.fars3-existing-resources.ts} | 0 ...> integ.fars3-new-resources.expected.json} | 63 ++--- ...ources.ts => integ.fars3-new-resources.ts} | 0 ...g.farsec-existing-resources.expected.json} | 66 ++--- ....ts => integ.farsec-existing-resources.ts} | 0 ... integ.farsec-new-resources.expected.json} | 66 ++--- ...urces.ts => integ.farsec-new-resources.ts} | 0 ...g.farsns-existing-resources.expected.json} | 66 ++--- ....ts => integ.farsns-existing-resources.ts} | 0 ... integ.farsns-new-resources.expected.json} | 66 ++--- ...urces.ts => integ.farsns-new-resources.ts} | 0 ...g.farsqs-existing-resources.expected.json} | 66 ++--- ....ts => integ.farsqs-existing-resources.ts} | 0 ... integ.farsqs-new-resources.expected.json} | 66 ++--- ...urces.ts => integ.farsqs-new-resources.ts} | 0 ...g.farssm-existing-resources.expected.json} | 66 ++--- ....ts => integ.farssm-existing-resources.ts} | 0 ... integ.farssm-new-resources.expected.json} | 66 ++--- ...urces.ts => integ.farssm-new-resources.ts} | 0 ... integ.farstp-new-resources.expected.json} | 68 ++--- ...urces.ts => integ.farstp-new-resources.ts} | 0 ...farstp-no-cloudwatch-alarms.expected.json} | 66 ++--- ...s => integ.farstp-no-cloudwatch-alarms.ts} | 0 ...otfhss3-customLoggingBucket.expected.json} | 124 ++++++++- ... => integ.iotfhss3-customLoggingBucket.ts} | 1 + ...integ.iotfhss3-no-arguments.expected.json} | 2 +- ...ents.ts => integ.iotfhss3-no-arguments.ts} | 0 ...eg.iotfhss3-noLoggingBucket.expected.json} | 2 +- ...t.ts => integ.iotfhss3-noLoggingBucket.ts} | 0 ...tkin-existing-kinesisstream.expected.json} | 4 +- ...=> integ.iotkin-existing-kinesisstream.ts} | 0 ...eg.iotkin-new-kinesisstream.expected.json} | 4 +- ...m.ts => integ.iotkin-new-kinesisstream.ts} | 0 ...> integ.iotkin-no-arguments.expected.json} | 4 +- ...uments.ts => integ.iotkin-no-arguments.ts} | 0 ...tlamddb-iot-lambda-dynamodb.expected.json} | 0 ...=> integ.iotlamddb-iot-lambda-dynamodb.ts} | 0 ...=> integ.iotlamddb-with-vpc.expected.json} | 22 +- ...ith-vpc.ts => integ.iotlamddb-with-vpc.ts} | 0 ....iotlam-iot-lambda-new-func.expected.json} | 0 ...ts => integ.iotlam-iot-lambda-new-func.ts} | 0 ...ot-lambda-use-existing-func.expected.json} | 0 ...eg.iotlam-iot-lambda-use-existing-func.ts} | 0 ...g.iots3-iot-s3-defaultprops.expected.json} | 0 ....ts => integ.iots3-iot-s3-defaultprops.ts} | 0 ...ots3-iot-s3-existing-bucket.expected.json} | 3 +- ... => integ.iots3-iot-s3-existing-bucket.ts} | 0 ...iot-s3-new-encrypted-bucket.expected.json} | 122 +++++++++ ...nteg.iots3-iot-s3-new-encrypted-bucket.ts} | 1 + ...qs-custom-max-receive-count.expected.json} | 4 +- ... integ.iotsqs-custom-max-receive-count.ts} | 0 ...otsqs-dead-letter-queue-off.expected.json} | 4 +- ... => integ.iotsqs-dead-letter-queue-off.ts} | 0 ...eg.iotsqs-default-arguments.expected.json} | 4 +- ...s.ts => integ.iotsqs-default-arguments.ts} | 0 ...integ.iotsqs-existing-queue.expected.json} | 0 ...ueue.ts => integ.iotsqs-existing-queue.ts} | 0 ...eg.iotsqs-use-kms-key-props.expected.json} | 4 +- ...s.ts => integ.iotsqs-use-kms-key-props.ts} | 0 ...nteg.iotsqs-use-queue-props.expected.json} | 4 +- ...ops.ts => integ.iotsqs-use-queue-props.ts} | 0 ...eg.iotsqs-with-existing-key.expected.json} | 4 +- ...y.ts => integ.iotsqs-with-existing-key.ts} | 0 ...tsqs-without-create-kms-key.expected.json} | 0 ...=> integ.iotsqs-without-create-kms-key.ts} | 0 ...g.fhss3-customLoggingBucket.expected.json} | 124 ++++++++- ....ts => integ.fhss3-customLoggingBucket.ts} | 1 + ...=> integ.fhss3-no-arguments.expected.json} | 188 ++++++++++++- ...guments.ts => integ.fhss3-no-arguments.ts} | 4 +- ...integ.fhss3-noLoggingBucket.expected.json} | 2 +- ...cket.ts => integ.fhss3-noLoggingBucket.ts} | 0 ...g.fhss3-pre-existing-bucket.expected.json} | 5 +- ....ts => integ.fhss3-pre-existing-bucket.ts} | 0 ...pre-existing-logging-bucket.expected.json} | 6 +- ...nteg.fhss3-pre-existing-logging-bucket.ts} | 0 ...> integ.fhss3-two-instances.expected.json} | 254 +++++++++++++++++- ...tances.ts => integ.fhss3-two-instances.ts} | 3 + ...integ.kinglu-code-asset-job.expected.json} | 0 ...-job.ts => integ.kinglu-code-asset-job.ts} | 0 ...> integ.kinglu-existing-job.expected.json} | 0 ...ng-job.ts => integ.kinglu-existing-job.ts} | 0 ...> integ.kinglu-no-arguments.expected.json} | 0 ...uments.ts => integ.kinglu-no-arguments.ts} | 0 ...infhss3-customLoggingBucket.expected.json} | 124 ++++++++- ... => integ.kinfhss3-customLoggingBucket.ts} | 1 + ...eg.kinfhss3-existing-bucket.expected.json} | 5 +- ...t.ts => integ.kinfhss3-existing-bucket.ts} | 0 ...ss3-existing-logging-bucket.expected.json} | 5 +- ...integ.kinfhss3-existing-logging-bucket.ts} | 0 ....kinfhss3-existingStreamObj.expected.json} | 4 +- ...ts => integ.kinfhss3-existingStreamObj.ts} | 0 ...integ.kinfhss3-no-arguments.expected.json} | 2 +- ...ents.ts => integ.kinfhss3-no-arguments.ts} | 0 ...on => integ.kinlam-existing.expected.json} | 2 +- ...g.existing.ts => integ.kinlam-existing.ts} | 0 ...> integ.kinlam-no-arguments.expected.json} | 2 +- ...uments.ts => integ.kinlam-no-arguments.ts} | 0 ....lamddb-add-secondary-index.expected.json} | 0 ...ts => integ.lamddb-add-secondary-index.ts} | 0 ...ployFunctionWithExistingVpc.expected.json} | 48 ++-- ...g.lamddb-deployFunctionWithExistingVpc.ts} | 0 ...amddb-deployFunctionWithVpc.expected.json} | 22 +- ... => integ.lamddb-deployFunctionWithVpc.ts} | 0 ...> integ.lamddb-no-arguments.expected.json} | 0 ...uments.ts => integ.lamddb-no-arguments.ts} | 0 ...teg.lamddb-set-billing-mode.expected.json} | 0 ...de.ts => integ.lamddb-set-billing-mode.ts} | 0 ...eg.lamddb-use-existing-func.expected.json} | 0 ...c.ts => integ.lamddb-use-existing-func.ts} | 0 ...eg.lammem-existingResources.expected.json} | 26 +- ...s.ts => integ.lammem-existingResources.ts} | 0 ...> integ.lammem-newResources.expected.json} | 24 +- ...ources.ts => integ.lammem-newResources.ts} | 0 ...nteg.lammem-withClientProps.expected.json} | 24 +- ...ops.ts => integ.lammem-withClientProps.ts} | 0 ...oyFunctionWithClusterConfig.expected.json} | 18 +- ...lamels-deployFunctionWithClusterConfig.ts} | 0 ...ployFunctionWithExistingVpc.expected.json} | 48 ++-- ...g.lamels-deployFunctionWithExistingVpc.ts} | 0 ...-deployFunctionWithVpcProps.expected.json} | 22 +- ...nteg.lamels-deployFunctionWithVpcProps.ts} | 0 ...eg.lamels-deployToFiveZones.expected.json} | 22 +- ...s.ts => integ.lamels-deployToFiveZones.ts} | 0 ...amels-disabledZoneAwareness.expected.json} | 14 +- ... => integ.lamels-disabledZoneAwareness.ts} | 0 ...teg.lamels-domain-arguments.expected.json} | 0 ...ts.ts => integ.lamels-domain-arguments.ts} | 0 ...> integ.lamels-no-arguments.expected.json} | 48 ++-- ...uments.ts => integ.lamels-no-arguments.ts} | 4 +- ...integ.lamevt-deployFunction.expected.json} | 0 ...tion.ts => integ.lamevt-deployFunction.ts} | 0 ...ployFunctionWithNewEventBus.expected.json} | 28 +- ...g.lamevt-deployFunctionWithNewEventBus.ts} | 0 ...amevt-deployFunctionWithVpc.expected.json} | 28 +- ... => integ.lamevt-deployFunctionWithVpc.ts} | 0 ...teg.lamevt-existingEventBus.expected.json} | 0 ...us.ts => integ.lamevt-existingEventBus.ts} | 0 ...teg.lamevt-existingFunction.expected.json} | 0 ...on.ts => integ.lamevt-existingFunction.ts} | 0 ...eg.lamken-minimal-arguments.expected.json} | 3 +- ...s.ts => integ.lamken-minimal-arguments.ts} | 0 ...teg.lamken-multiple-sources.expected.json} | 3 +- ...es.ts => integ.lamken-multiple-sources.ts} | 0 ...on => integ.lamken-with-vpc.expected.json} | 31 +-- ...g.with-vpc.ts => integ.lamken-with-vpc.ts} | 0 ...eg.lamfhs-existing-function.expected.json} | 8 +- ...n.ts => integ.lamfhs-existing-function.ts} | 0 ...> integ.lamfhs-existing-vpc.expected.json} | 62 ++--- ...ng-vpc.ts => integ.lamfhs-existing-vpc.ts} | 0 ...son => integ.lamfhs-new-vpc.expected.json} | 36 +-- ...teg.new-vpc.ts => integ.lamfhs-new-vpc.ts} | 0 ...> integ.lamfhs-no-arguments.expected.json} | 8 +- ...uments.ts => integ.lamfhs-no-arguments.ts} | 0 ...integ.lamkin-existingLambda.expected.json} | 0 ...mbda.ts => integ.lamkin-existingLambda.ts} | 0 ...integ.lamkin-existingStream.expected.json} | 0 ...ream.ts => integ.lamkin-existingStream.ts} | 0 ...amkin-existingStreamWithCmk.expected.json} | 0 ... => integ.lamkin-existingStreamWithCmk.ts} | 0 ...=> integ.lamkin-existingVpc.expected.json} | 54 ++-- ...tingVpc.ts => integ.lamkin-existingVpc.ts} | 0 ...g.lamkin-newStreamFromProps.expected.json} | 0 ....ts => integ.lamkin-newStreamFromProps.ts} | 0 ...json => integ.lamkin-newVpc.expected.json} | 28 +- ...integ.newVpc.ts => integ.lamkin-newVpc.ts} | 0 ...nteg.lamkin-newVpcFromProps.expected.json} | 20 +- ...ops.ts => integ.lamkin-newVpcFromProps.ts} | 0 ...=> integ.lamkin-noArguments.expected.json} | 0 ...guments.ts => integ.lamkin-noArguments.ts} | 0 ...integ.lamopn-cluster-config.expected.json} | 18 +- ...nfig.ts => integ.lamopn-cluster-config.ts} | 0 ...opn-disabled-zone-awareness.expected.json} | 14 +- ...> integ.lamopn-disabled-zone-awareness.ts} | 0 ...teg.lamopn-domain-arguments.expected.json} | 0 ...ts.ts => integ.lamopn-domain-arguments.ts} | 0 ...> integ.lamopn-existing-vpc.expected.json} | 48 ++-- ...ng-vpc.ts => integ.lamopn-existing-vpc.ts} | 0 ...> integ.lamopn-no-arguments.expected.json} | 10 +- ...uments.ts => integ.lamopn-no-arguments.ts} | 2 +- ...n => integ.lamopn-vpc-props.expected.json} | 22 +- ...vpc-props.ts => integ.lamopn-vpc-props.ts} | 0 ...g.lams3-customLoggingBucket.expected.json} | 122 +++++++++ ....ts => integ.lams3-customLoggingBucket.ts} | 1 + ... integ.lams3-deployFunction.expected.json} | 0 ...ction.ts => integ.lams3-deployFunction.ts} | 0 ...lams3-deployFunctionWithVpc.expected.json} | 22 +- ...s => integ.lams3-deployFunctionWithVpc.ts} | 0 ...nteg.lams3-existingFunction.expected.json} | 0 ...ion.ts => integ.lams3-existingFunction.ts} | 0 ...g.lams3-pre-existing-bucket.expected.json} | 3 +- ....ts => integ.lams3-pre-existing-bucket.ts} | 0 ...integ.lamsag-deployFunction.expected.json} | 0 ...tion.ts => integ.lamsag-deployFunction.ts} | 0 ...teg.lamsag-existingFunction.expected.json} | 0 ...on.ts => integ.lamsag-existingFunction.ts} | 0 ...g-existingSageMakerEndpoint.expected.json} | 0 ...integ.lamsag-existingSageMakerEndpoint.ts} | 0 ...integ.lamsec-deployFunction.expected.json} | 0 ...tion.ts => integ.lamsec-deployFunction.ts} | 0 ...ployFunctionWithExistingVpc.expected.json} | 54 ++-- ...g.lamsec-deployFunctionWithExistingVpc.ts} | 0 ...amsec-deployFunctionWithVpc.expected.json} | 28 +- ... => integ.lamsec-deployFunctionWithVpc.ts} | 0 ...teg.lamsec-existingFunction.expected.json} | 0 ...on.ts => integ.lamsec-existingFunction.ts} | 0 ...integ.lamsns-deployFunction.expected.json} | 0 ...tion.ts => integ.lamsns-deployFunction.ts} | 0 ...amsns-deployFunctionWithVpc.expected.json} | 28 +- ... => integ.lamsns-deployFunctionWithVpc.ts} | 0 ...teg.lamsns-existingFunction.expected.json} | 0 ...on.ts => integ.lamsns-existingFunction.ts} | 0 ...lamsqslam-defaultDeployment.expected.json} | 2 +- ...s => integ.lamsqslam-defaultDeployment.ts} | 0 ...ployProducerFunctionWithVpc.expected.json} | 26 +- ...amsqslam-deployProducerFunctionWithVpc.ts} | 0 ...am-existingConsumerFunction.expected.json} | 2 +- ...teg.lamsqslam-existingConsumerFunction.ts} | 0 ...am-existingProducerFunction.expected.json} | 2 +- ...teg.lamsqslam-existingProducerFunction.ts} | 0 ...teg.lamsqslam-existingQueue.expected.json} | 2 +- ...ue.ts => integ.lamsqslam-existingQueue.ts} | 0 ...integ.lamsqs-deployFunction.expected.json} | 0 ...tion.ts => integ.lamsqs-deployFunction.ts} | 0 ...amsqs-deployFunctionWithVpc.expected.json} | 28 +- ... => integ.lamsqs-deployFunctionWithVpc.ts} | 0 ...teg.lamsqs-existingFunction.expected.json} | 0 ...on.ts => integ.lamsqs-existingFunction.ts} | 0 ...integ.lamssm-deployFunction.expected.json} | 0 ...tion.ts => integ.lamssm-deployFunction.ts} | 0 ...ployFunctionWithExistingVpc.expected.json} | 54 ++-- ...g.lamssm-deployFunctionWithExistingVpc.ts} | 0 ...amssm-deployFunctionWithVpc.expected.json} | 28 +- ... => integ.lamssm-deployFunctionWithVpc.ts} | 0 ...teg.lamssm-existingFunction.expected.json} | 0 ...on.ts => integ.lamssm-existingFunction.ts} | 0 ...ssm-existingStringParameter.expected.json} | 0 ...> integ.lamssm-existingStringParameter.ts} | 0 ... integ.lamstp-deploy-lambda.expected.json} | 2 +- ...ambda.ts => integ.lamstp-deploy-lambda.ts} | 0 ...amstp-deployFunctionWithVpc.expected.json} | 28 +- ... => integ.lamstp-deployFunctionWithVpc.ts} | 0 ...eg.lamstp-existing-function.expected.json} | 0 ...n.ts => integ.lamstp-existing-function.ts} | 0 ...ssetExistingLambdaFunctions.expected.json} | 2 +- ...am-apiFromAssetExistingLambdaFunctions.ts} | 0 ...FromAssetNewLambdaFunctions.expected.json} | 2 +- ....opilam-apiFromAssetNewLambdaFunctions.ts} | 0 ...apiFromAssetWithCognitoAuth.expected.json} | 2 +- ...teg.opilam-apiFromAssetWithCognitoAuth.ts} | 0 ...teg.r53alb-deployPrivateApi.expected.json} | 25 +- ...pi.ts => integ.r53alb-deployPrivateApi.ts} | 0 ...eployPrivateApiExistingZone.expected.json} | 51 ++-- ...eg.r53alb-deployPrivateApiExistingZone.ts} | 0 ...-deployPublicApiExistingAlb.expected.json} | 48 ++-- ...nteg.r53alb-deployPublicApiExistingAlb.ts} | 0 ...53alb-deployPublicApiNewAlb.expected.json} | 51 ++-- ... => integ.r53alb-deployPublicApiNewAlb.ts} | 0 ...r53alb-deployWithoutLogging.expected.json} | 22 +- ...s => integ.r53alb-deployWithoutLogging.ts} | 0 ...n => integ.r53api-dummyTest.expected.json} | 20 +- ...dummyTest.ts => integ.r53api-dummyTest.ts} | 0 ...eg.s3lam-existing-s3-bucket.expected.json} | 7 +- ...t.ts => integ.s3lam-existing-s3-bucket.ts} | 0 ...=> integ.s3lam-no-arguments.expected.json} | 126 ++++++++- ...guments.ts => integ.s3lam-no-arguments.ts} | 1 + ...g.s3sns-customLoggingBucket.expected.json} | 122 +++++++++ ....ts => integ.s3sns-customLoggingBucket.ts} | 1 + ...nteg.s3sns-existingS3Bucket.expected.json} | 3 +- ...ket.ts => integ.s3sns-existingS3Bucket.ts} | 0 ...nteg.s3sns-existingSnsTopic.expected.json} | 0 ...pic.ts => integ.s3sns-existingSnsTopic.ts} | 0 ...existingUnencryptedSnsTopic.expected.json} | 0 ...nteg.s3sns-existingUnencryptedSnsTopic.ts} | 0 ...teg.s3sns-newTopicFromProps.expected.json} | 0 ...ps.ts => integ.s3sns-newTopicFromProps.ts} | 0 ... => integ.s3sns-noArguments.expected.json} | 0 ...rguments.ts => integ.s3sns-noArguments.ts} | 0 ...3sns-s3EventTypesAndFilters.expected.json} | 0 ... => integ.s3sns-s3EventTypesAndFilters.ts} | 0 ...s-snsTopicWithAwsManagedKey.expected.json} | 0 ... integ.s3sns-snsTopicWithAwsManagedKey.ts} | 0 ...nteg.s3sqs-creatingNewQueue.expected.json} | 0 ...eue.ts => integ.s3sqs-creatingNewQueue.ts} | 0 ...g.s3sqs-customLoggingBucket.expected.json} | 122 +++++++++ ....ts => integ.s3sqs-customLoggingBucket.ts} | 1 + ...s3sqs-existingLoggingBucket.expected.json} | 4 +- ...s => integ.s3sqs-existingLoggingBucket.ts} | 0 ...> integ.s3sqs-existingQueue.expected.json} | 0 ...gQueue.ts => integ.s3sqs-existingQueue.ts} | 0 ...nteg.s3sqs-existingS3Bucket.expected.json} | 3 +- ...ket.ts => integ.s3sqs-existingS3Bucket.ts} | 0 ... => integ.s3sqs-noArguments.expected.json} | 0 ...rguments.ts => integ.s3sqs-noArguments.ts} | 0 ...g.s3stp-customLoggingBucket.expected.json} | 122 +++++++++ ....ts => integ.s3stp-customLoggingBucket.ts} | 1 + ...g.s3stp-pre-existing-bucket.expected.json} | 3 +- ....ts => integ.s3stp-pre-existing-bucket.ts} | 0 ...3-stepfunctions-no-argument.expected.json} | 2 +- ...teg.s3stp-s3-stepfunctions-no-argument.ts} | 0 ...> integ.snslam-no-arguments.expected.json} | 2 +- ...uments.ts => integ.snslam-no-arguments.ts} | 0 ...nteg.snssqs-deployFIFOQueue.expected.json} | 18 +- ...eue.ts => integ.snssqs-deployFIFOQueue.ts} | 0 ....snssqs-deployStandardQueue.expected.json} | 18 +- ...ts => integ.snssqs-deployStandardQueue.ts} | 0 ...teg.snssqs-existing-kms-key.expected.json} | 14 +- ...ey.ts => integ.snssqs-existing-kms-key.ts} | 0 ...> integ.snssqs-no-arguments.expected.json} | 14 +- ...uments.ts => integ.snssqs-no-arguments.ts} | 0 ...g.snssqs-rawMessageDelivery.expected.json} | 18 +- ....ts => integ.snssqs-rawMessageDelivery.ts} | 0 ...snssqs-sns-existing-kms-key.expected.json} | 18 +- ...s => integ.snssqs-sns-existing-kms-key.ts} | 0 ....snssqs-sns-managed-kms-key.expected.json} | 14 +- ...ts => integ.snssqs-sns-managed-kms-key.ts} | 0 ...nteg.sqslam-deployFifoQueue.expected.json} | 2 +- ...eue.ts => integ.sqslam-deployFifoQueue.ts} | 0 ...integ.sqslam-deployFunction.expected.json} | 2 +- ...tion.ts => integ.sqslam-deployFunction.ts} | 0 ...teg.sqslam-existingFunction.expected.json} | 2 +- ...on.ts => integ.sqslam-existingFunction.ts} | 0 ...> integ.wafalb-no-arguments.expected.json} | 48 ++-- ...uments.ts => integ.wafalb-no-arguments.ts} | 0 ...ng-waf-to-multiple-gateways.expected.json} | 16 +- ...fapi-existing-waf-to-multiple-gateways.ts} | 0 ...> integ.wafapi-no-arguments.expected.json} | 8 +- ...uments.ts => integ.wafapi-no-arguments.ts} | 0 ...eg.wafapi-partial-arguments.expected.json} | 8 +- ...s.ts => integ.wafapi-partial-arguments.ts} | 0 ...> integ.wafaps-no-arguments.expected.json} | 0 ...uments.ts => integ.wafaps-no-arguments.ts} | 0 ...eg.wafaps-partial-arguments.expected.json} | 0 ...s.ts => integ.wafaps-partial-arguments.ts} | 0 ...-waf-to-multiple-cloudfront.expected.json} | 24 +- ...ft-existing-waf-to-multiple-cloudfront.ts} | 0 ...> integ.wafcft-no-arguments.expected.json} | 12 +- ...uments.ts => integ.wafcft-no-arguments.ts} | 0 ...eg.wafcft-partial-arguments.expected.json} | 12 +- ...s.ts => integ.wafcft-partial-arguments.ts} | 0 534 files changed, 4829 insertions(+), 3086 deletions(-) rename source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/{integ.all-existing-private-http.expected.json => integ.albfar-all-existing-private-http.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/{integ.all-existing-private-http.ts => integ.albfar-all-existing-private-http.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/{integ.all-new-public-http.expected.json => integ.albfar-all-new-public-http.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/{integ.all-new-public-http.ts => integ.albfar-all-new-public-http.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/{integ.all-new-two-targets.expected.json => integ.albfar-all-new-two-targets.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/{integ.all-new-two-targets.ts => integ.albfar-all-new-two-targets.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.privateApiExistingResources.expected.json => integ.alblam-privateApiExistingResources.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.privateApiExistingResources.ts => integ.alblam-privateApiExistingResources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.privateApiNewResources.expected.json => integ.alblam-privateApiNewResources.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.privateApiNewResources.ts => integ.alblam-privateApiNewResources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.publicApiExistingResources.expected.json => integ.alblam-publicApiExistingResources.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.publicApiExistingResources.ts => integ.alblam-publicApiExistingResources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.publicApiNewResources.expected.json => integ.alblam-publicApiNewResources.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.publicApiNewResources.ts => integ.alblam-publicApiNewResources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.twoTargets.expected.json => integ.alblam-twoTargets.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/{integ.twoTargets.ts => integ.alblam-twoTargets.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.additional-request-templates-custom-resource-name.expected.json => integ.apiddb-additional-request-templates-custom-resource-name.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.additional-request-templates-custom-resource-name.ts => integ.apiddb-additional-request-templates-custom-resource-name.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.additional-request-templates.expected.json => integ.apiddb-additional-request-templates.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.additional-request-templates.ts => integ.apiddb-additional-request-templates.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.apigateway-dynamodb-CRUD.expected.json => integ.apiddb-apigateway-dynamodb-CRUD.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.apigateway-dynamodb-CRUD.ts => integ.apiddb-apigateway-dynamodb-CRUD.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.apigateway-dynamodb-existing-table.expected.json => integ.apiddb-apigateway-dynamodb-existing-table.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.apigateway-dynamodb-existing-table.ts => integ.apiddb-apigateway-dynamodb-existing-table.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.custom-integration-responses.expected.json => integ.apiddb-custom-integration-responses.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.custom-integration-responses.ts => integ.apiddb-custom-integration-responses.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.no-arguments.expected.json => integ.apiddb-no-arguments.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/{integ.no-arguments.ts => integ.apiddb-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/{integ.defaultParams.expected.json => integ.apiiot-defaultParams.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/{integ.defaultParams.ts => integ.apiiot-defaultParams.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/{integ.overrideParams.expected.json => integ.apiiot-overrideParams.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/{integ.overrideParams.ts => integ.apiiot-overrideParams.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/{integ.override_auth_api_keys.expected.json => integ.apiiot-override_auth_api_keys.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/{integ.override_auth_api_keys.ts => integ.apiiot-override_auth_api_keys.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/{integ.additional-request-templates.expected.json => integ.apikin-additional-request-templates.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/{integ.additional-request-templates.ts => integ.apikin-additional-request-templates.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/{integ.apigateway-kinesis-overwrite.expected.json => integ.apikin-apigateway-kinesis-overwrite.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/{integ.apigateway-kinesis-overwrite.ts => integ.apikin-apigateway-kinesis-overwrite.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/{integ.custom-integration-responses.expected.json => integ.apikin-custom-integration-responses.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/{integ.custom-integration-responses.ts => integ.apikin-custom-integration-responses.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/{integ.no-arguments.expected.json => integ.apikin-no-arguments.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/{integ.no-arguments.ts => integ.apikin-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/{integ.deployFunction.expected.json => integ.apilam-deployFunction.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/{integ.deployFunction.ts => integ.apilam-deployFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/{integ.existingFunction.expected.json => integ.apilam-existingFunction.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/{integ.existingFunction.ts => integ.apilam-existingFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/{integ.additional-request-templates.expected.json => integ.apisag-additional-request-templates.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/{integ.additional-request-templates.ts => integ.apisag-additional-request-templates.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/{integ.apigateway-sagemakerendpoint-overwrite.expected.json => integ.apisag-apigateway-sagemakerendpoint-overwrite.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/{integ.apigateway-sagemakerendpoint-overwrite.ts => integ.apisag-apigateway-sagemakerendpoint-overwrite.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/{integ.no-overwrite.expected.json => integ.apisag-no-overwrite.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/{integ.no-overwrite.ts => integ.apisag-no-overwrite.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.additional-request-templates.expected.json => integ.apisqs-additional-request-templates.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.additional-request-templates.ts => integ.apisqs-additional-request-templates.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.apigateway-sqs-crud.expected.json => integ.apisqs-apigateway-sqs-crud.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.apigateway-sqs-crud.ts => integ.apisqs-apigateway-sqs-crud.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.custom-integration-responses.expected.json => integ.apisqs-custom-integration-responses.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.custom-integration-responses.ts => integ.apisqs-custom-integration-responses.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.existing-queue.expected.json => integ.apisqs-existing-queue.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.existing-queue.ts => integ.apisqs-existing-queue.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.no-arguments.expected.json => integ.apisqs-no-arguments.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/{integ.no-arguments.ts => integ.apisqs-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/{integ.customCloudfrontLoggingBucket.expected.json => integ.cftaplam-customCloudfrontLoggingBucket.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/{integ.customCloudfrontLoggingBucket.ts => integ.cftaplam-customCloudfrontLoggingBucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/{integ.no-arguments.expected.json => integ.cftaplam-no-arguments.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/{integ.no-arguments.ts => integ.cftaplam-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/{integ.override-behavior.expected.json => integ.cftaplam-override-behavior.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/{integ.override-behavior.ts => integ.cftaplam-override-behavior.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/{integ.customCloudfrontLoggingBucket.expected.json => integ.cftapi-customCloudfrontLoggingBucket.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/{integ.customCloudfrontLoggingBucket.ts => integ.cftapi-customCloudfrontLoggingBucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/{integ.no-arguments.expected.json => integ.cftapi-no-arguments.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/{integ.no-arguments.ts => integ.cftapi-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.customCloudFrontLoggingBucket.expected.json => integ.cftmed-customCloudFrontLoggingBucket.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.customCloudFrontLoggingBucket.ts => integ.cftmed-customCloudFrontLoggingBucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.default.expected.json => integ.cftmed-default.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.default.ts => integ.cftmed-default.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.existingContainer.expected.json => integ.cftmed-existingContainer.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.existingContainer.ts => integ.cftmed-existingContainer.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.overrideProperties.expected.json => integ.cftmed-overrideProperties.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.overrideProperties.ts => integ.cftmed-overrideProperties.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.withSecurityHeaderBehavior.expected.json => integ.cftmed-withSecurityHeaderBehavior.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.withSecurityHeaderBehavior.ts => integ.cftmed-withSecurityHeaderBehavior.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.withoutHttpSecurityHeaders.expected.json => integ.cftmed-withoutHttpSecurityHeaders.expected.json} (97%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/{integ.withoutHttpSecurityHeaders.ts => integ.cftmed-withoutHttpSecurityHeaders.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.custom-security-headers.expected.json => integ.cfts3-custom-headers.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.custom-security-headers.ts => integ.cfts3-custom-headers.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.custom-originPath.expected.json => integ.cfts3-custom-originPath.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.custom-originPath.ts => integ.cfts3-custom-originPath.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.customCloudFrontLoggingBucket.expected.json => integ.cfts3-customCloudFrontLoggingBucket.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.customCloudFrontLoggingBucket.ts => integ.cfts3-customCloudFrontLoggingBucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.customLoggingBucket.expected.json => integ.cfts3-customLoggingBucket.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.customLoggingBucket.ts => integ.cfts3-customLoggingBucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.existing-bucket.expected.json => integ.cfts3-existing-bucket.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.existing-bucket.ts => integ.cfts3-existing-bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.no-arguments.expected.json => integ.cfts3-no-arguments.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.no-arguments.ts => integ.cfts3-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.no-security-headers.expected.json => integ.cfts3-no-security-headers.expected.json} (97%) rename source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/{integ.no-security-headers.ts => integ.cfts3-no-security-headers.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/{integ.no-arguments.expected.json => integ.cogapilam-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/{integ.no-arguments.ts => integ.cogapilam-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/{integ.deploy-with-vpc.expected.json => integ.dbslamels-deploy-with-vpc.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/{integ.deploy-with-vpc.ts => integ.dbslamels-deploy-with-vpc.ts} (94%) rename source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/{integ.no-arguments.expected.json => integ.dbslamels-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/{integ.no-arguments.ts => integ.dbslamels-no-arguments.ts} (96%) rename source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/{integ.existing-table.expected.json => integ.dbslam-existing-table.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/{integ.existing-table.ts => integ.dbslam-existing-table.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/{integ.no-arguments.expected.json => integ.dbslam-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/{integ.no-arguments.ts => integ.dbslam-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.customLoggingBucket.expected.json => integ.evtfhss3-customLoggingBucket.expected.json} (79%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.customLoggingBucket.ts => integ.evtfhss3-customLoggingBucket.ts} (98%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json => integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.eventbridge-kinesisfirehose-s3-existing-eventbus.ts => integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.eventbridge-kinesisfirehose-s3-new-eventbus.expected.json => integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.eventbridge-kinesisfirehose-s3-new-eventbus.ts => integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.eventbridge-kinesisfirehose-s3-no-arguments.expected.json => integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.eventbridge-kinesisfirehose-s3-no-arguments.ts => integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.existingLoggingBucket.expected.json => integ.evtfhss3-existingLoggingBucket.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.existingLoggingBucket.ts => integ.evtfhss3-existingLoggingBucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/{integ.eventbridge-kinesisstreams-existing-eventbus.expected.json => integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/{integ.eventbridge-kinesisstreams-existing-eventbus.ts => integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/{integ.eventbridge-kinesisstreams-existing.expected.json => integ.evtkin-eventbridge-kinesisstreams-existing.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/{integ.eventbridge-kinesisstreams-existing.ts => integ.evtkin-eventbridge-kinesisstreams-existing.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/{integ.eventbridge-kinesisstreams-new-eventbus.expected.json => integ.evtkin-eventbridge-kinesisstreams-new-eventbus.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/{integ.eventbridge-kinesisstreams-new-eventbus.ts => integ.evtkin-eventbridge-kinesisstreams-new-eventbus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/{integ.eventbridge-kinesisstreams-no-arguments.expected.json => integ.evtkin-eventbridge-kinesisstreams-no-arguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/{integ.eventbridge-kinesisstreams-no-arguments.ts => integ.evtkin-eventbridge-kinesisstreams-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/{integ.eventbridge-existing-eventbus.expected.json => integ.evtlam-eventbridge-existing-eventbus.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/{integ.eventbridge-existing-eventbus.ts => integ.evtlam-eventbridge-existing-eventbus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/{integ.eventbridge-new-eventbus.expected.json => integ.evtlam-eventbridge-new-eventbus.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/{integ.eventbridge-new-eventbus.ts => integ.evtlam-eventbridge-new-eventbus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/{integ.eventbridge-no-argument.expected.json => integ.evtlam-eventbridge-no-argument.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/{integ.eventbridge-no-argument.ts => integ.evtlam-eventbridge-no-argument.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.exist-bus.expected.json => integ.evtsns-exist-bus.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.exist-bus.ts => integ.evtsns-exist-bus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.long-stack-name.expected.json => integ.evtsns-long-stack-name.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.long-stack-name.ts => integ.evtsns-long-stack-name.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.new-bus.expected.json => integ.evtsns-new-bus.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.new-bus.ts => integ.evtsns-new-bus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.no-arg.expected.json => integ.evtsns-no-arg.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.no-arg.ts => integ.evtsns-no-arg.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.second-long-stack-name.expected.json => integ.evtsns-second-long-stack-name.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/{integ.second-long-stack-name.ts => integ.evtsns-second-long-stack-name.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/{integ.exist-bus.expected.json => integ.evtsqs-exist-bus.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/{integ.exist-bus.ts => integ.evtsqs-exist-bus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/{integ.exist-queue.expected.json => integ.evtsqs-exist-queue.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/{integ.exist-queue.ts => integ.evtsqs-exist-queue.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/{integ.new-bus.expected.json => integ.evtsqs-new-bus.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/{integ.new-bus.ts => integ.evtsqs-new-bus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/{integ.no-arg.expected.json => integ.evtsqs-no-arg.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/{integ.no-arg.ts => integ.evtsqs-no-arg.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/{integ.eventbridge-stepfunctions-existing-eventbus.expected.json => integ.evtstp-eventbridge-stepfunctions-existing-eventbus.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/{integ.eventbridge-stepfunctions-existing-eventbus.ts => integ.evtstp-eventbridge-stepfunctions-existing-eventbus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/{integ.eventbridge-stepfunctions-new-eventbus.expected.json => integ.evtstp-eventbridge-stepfunctions-new-eventbus.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/{integ.eventbridge-stepfunctions-new-eventbus.ts => integ.evtstp-eventbridge-stepfunctions-new-eventbus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/{integ.eventbridge-stepfunctions-no-argument.expected.json => integ.evtstp-eventbridge-stepfunctions-no-argument.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/{integ.eventbridge-stepfunctions-no-argument.ts => integ.evtstp-eventbridge-stepfunctions-no-argument.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/{integ.eventbridge-stepfunctions-with-lambda.expected.json => integ.evtstp-eventbridge-stepfunctions-with-lambda.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/{integ.eventbridge-stepfunctions-with-lambda.ts => integ.evtstp-eventbridge-stepfunctions-with-lambda.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/{integ.existing-resources.expected.json => integ.farddb-existing-resources.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/{integ.existing-resources.ts => integ.farddb-existing-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/{integ.new-resources.expected.json => integ.farddb-new-resources.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/{integ.new-resources.ts => integ.farddb-new-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/{integ.existing-resources.expected.json => integ.farevt-existing-resources.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/{integ.existing-resources.ts => integ.farevt-existing-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/{integ.new-resources.expected.json => integ.farevt-new-resources.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/{integ.new-resources.ts => integ.farevt-new-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.existingFargateService.expected.json => integ.farfhs-existingFargateService.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.existingFargateService.ts => integ.farfhs-existingFargateService.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.existingVpc.expected.json => integ.farfhs-existingVpc.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.existingVpc.ts => integ.farfhs-existingVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.fargateServiceFromProps.expected.json => integ.farfhs-fargateServiceFromProps.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.fargateServiceFromProps.ts => integ.farfhs-fargateServiceFromProps.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.noArguments.expected.json => integ.farfhs-noArguments.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.noArguments.ts => integ.farfhs-noArguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.vpcFromprops.expected.json => integ.farfhs-vpcFromprops.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/{integ.vpcFromprops.ts => integ.farfhs-vpcFromprops.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.existingFargateService.expected.json => integ.farkin-existingFargateService.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.existingFargateService.ts => integ.farkin-existingFargateService.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.existingStream.expected.json => integ.farkin-existingStream.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.existingStream.ts => integ.farkin-existingStream.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.existingVpc.expected.json => integ.farkin-existingVpc.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.existingVpc.ts => integ.farkin-existingVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.fargateServiceFromProps.expected.json => integ.farkin-fargateServiceFromProps.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.fargateServiceFromProps.ts => integ.farkin-fargateServiceFromProps.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.noArguments.expected.json => integ.farkin-noArguments.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.noArguments.ts => integ.farkin-noArguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.streamFromProps.expected.json => integ.farkin-streamFromProps.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.streamFromProps.ts => integ.farkin-streamFromProps.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.vpcFromProps.expected.json => integ.farkin-vpcFromProps.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/{integ.vpcFromProps.ts => integ.farkin-vpcFromProps.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/{integ.existing-resources.expected.json => integ.faropn-existing-resources.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/{integ.existing-resources.ts => integ.faropn-existing-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/{integ.new-resources.expected.json => integ.faropn-new-resources.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/{integ.new-resources.ts => integ.faropn-new-resources.ts} (95%) rename source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/{integ.existing-resources.expected.json => integ.fars3-existing-resources.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/{integ.existing-resources.ts => integ.fars3-existing-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/{integ.new-resources.expected.json => integ.fars3-new-resources.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/{integ.new-resources.ts => integ.fars3-new-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/{integ.existing-resources.expected.json => integ.farsec-existing-resources.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/{integ.existing-resources.ts => integ.farsec-existing-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/{integ.new-resources.expected.json => integ.farsec-new-resources.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/{integ.new-resources.ts => integ.farsec-new-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/{integ.existing-resources.expected.json => integ.farsns-existing-resources.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/{integ.existing-resources.ts => integ.farsns-existing-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/{integ.new-resources.expected.json => integ.farsns-new-resources.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/{integ.new-resources.ts => integ.farsns-new-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/{integ.existing-resources.expected.json => integ.farsqs-existing-resources.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/{integ.existing-resources.ts => integ.farsqs-existing-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/{integ.new-resources.expected.json => integ.farsqs-new-resources.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/{integ.new-resources.ts => integ.farsqs-new-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/{integ.existing-resources.expected.json => integ.farssm-existing-resources.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/{integ.existing-resources.ts => integ.farssm-existing-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/{integ.new-resources.expected.json => integ.farssm-new-resources.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/{integ.new-resources.ts => integ.farssm-new-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/{integ.new-resources.expected.json => integ.farstp-new-resources.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/{integ.new-resources.ts => integ.farstp-new-resources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/{integ.no-cloudwatch-alarms.expected.json => integ.farstp-no-cloudwatch-alarms.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/{integ.no-cloudwatch-alarms.ts => integ.farstp-no-cloudwatch-alarms.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/{integ.customLoggingBucket.expected.json => integ.iotfhss3-customLoggingBucket.expected.json} (79%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/{integ.customLoggingBucket.ts => integ.iotfhss3-customLoggingBucket.ts} (98%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/{integ.no-arguments.expected.json => integ.iotfhss3-no-arguments.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/{integ.no-arguments.ts => integ.iotfhss3-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/{integ.noLoggingBucket.expected.json => integ.iotfhss3-noLoggingBucket.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/{integ.noLoggingBucket.ts => integ.iotfhss3-noLoggingBucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/{integ.existing-kinesisstream.expected.json => integ.iotkin-existing-kinesisstream.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/{integ.existing-kinesisstream.ts => integ.iotkin-existing-kinesisstream.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/{integ.new-kinesisstream.expected.json => integ.iotkin-new-kinesisstream.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/{integ.new-kinesisstream.ts => integ.iotkin-new-kinesisstream.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/{integ.no-arguments.expected.json => integ.iotkin-no-arguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/{integ.no-arguments.ts => integ.iotkin-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/{integ.iot-lambda-dynamodb.expected.json => integ.iotlamddb-iot-lambda-dynamodb.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/{integ.iot-lambda-dynamodb.ts => integ.iotlamddb-iot-lambda-dynamodb.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/{integ.with-vpc.expected.json => integ.iotlamddb-with-vpc.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/{integ.with-vpc.ts => integ.iotlamddb-with-vpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/{integ.iot-lambda-new-func.expected.json => integ.iotlam-iot-lambda-new-func.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/{integ.iot-lambda-new-func.ts => integ.iotlam-iot-lambda-new-func.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/{integ.iot-lambda-use-existing-func.expected.json => integ.iotlam-iot-lambda-use-existing-func.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/{integ.iot-lambda-use-existing-func.ts => integ.iotlam-iot-lambda-use-existing-func.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-s3/test/{integ.iot-s3-defaultprops.expected.json => integ.iots3-iot-s3-defaultprops.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-s3/test/{integ.iot-s3-defaultprops.ts => integ.iots3-iot-s3-defaultprops.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-s3/test/{integ.iot-s3-existing-bucket.expected.json => integ.iots3-iot-s3-existing-bucket.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-iot-s3/test/{integ.iot-s3-existing-bucket.ts => integ.iots3-iot-s3-existing-bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-s3/test/{integ.iot-s3-new-encrypted-bucket.expected.json => integ.iots3-iot-s3-new-encrypted-bucket.expected.json} (75%) rename source/patterns/@aws-solutions-constructs/aws-iot-s3/test/{integ.iot-s3-new-encrypted-bucket.ts => integ.iots3-iot-s3-new-encrypted-bucket.ts} (98%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.custom-max-receive-count.expected.json => integ.iotsqs-custom-max-receive-count.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.custom-max-receive-count.ts => integ.iotsqs-custom-max-receive-count.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.dead-letter-queue-off.expected.json => integ.iotsqs-dead-letter-queue-off.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.dead-letter-queue-off.ts => integ.iotsqs-dead-letter-queue-off.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.default-arguments.expected.json => integ.iotsqs-default-arguments.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.default-arguments.ts => integ.iotsqs-default-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.existing-queue.expected.json => integ.iotsqs-existing-queue.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.existing-queue.ts => integ.iotsqs-existing-queue.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.use-kms-key-props.expected.json => integ.iotsqs-use-kms-key-props.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.use-kms-key-props.ts => integ.iotsqs-use-kms-key-props.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.use-queue-props.expected.json => integ.iotsqs-use-queue-props.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.use-queue-props.ts => integ.iotsqs-use-queue-props.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.with-existing-key.expected.json => integ.iotsqs-with-existing-key.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.with-existing-key.ts => integ.iotsqs-with-existing-key.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.without-create-kms-key.expected.json => integ.iotsqs-without-create-kms-key.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/{integ.without-create-kms-key.ts => integ.iotsqs-without-create-kms-key.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.customLoggingBucket.expected.json => integ.fhss3-customLoggingBucket.expected.json} (77%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.customLoggingBucket.ts => integ.fhss3-customLoggingBucket.ts} (97%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.no-arguments.expected.json => integ.fhss3-no-arguments.expected.json} (69%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.no-arguments.ts => integ.fhss3-no-arguments.ts} (91%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.noLoggingBucket.expected.json => integ.fhss3-noLoggingBucket.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.noLoggingBucket.ts => integ.fhss3-noLoggingBucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.pre-existing-bucket.expected.json => integ.fhss3-pre-existing-bucket.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.pre-existing-bucket.ts => integ.fhss3-pre-existing-bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.pre-existing-logging-bucket.expected.json => integ.fhss3-pre-existing-logging-bucket.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.pre-existing-logging-bucket.ts => integ.fhss3-pre-existing-logging-bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.two-instances.expected.json => integ.fhss3-two-instances.expected.json} (76%) rename source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/{integ.two-instances.ts => integ.fhss3-two-instances.ts} (94%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/{integ.code-asset-job.expected.json => integ.kinglu-code-asset-job.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/{integ.code-asset-job.ts => integ.kinglu-code-asset-job.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/{integ.existing-job.expected.json => integ.kinglu-existing-job.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/{integ.existing-job.ts => integ.kinglu-existing-job.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/{integ.no-arguments.expected.json => integ.kinglu-no-arguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/{integ.no-arguments.ts => integ.kinglu-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.customLoggingBucket.expected.json => integ.kinfhss3-customLoggingBucket.expected.json} (80%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.customLoggingBucket.ts => integ.kinfhss3-customLoggingBucket.ts} (97%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.existing-bucket.expected.json => integ.kinfhss3-existing-bucket.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.existing-bucket.ts => integ.kinfhss3-existing-bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.existing-logging-bucket.expected.json => integ.kinfhss3-existing-logging-bucket.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.existing-logging-bucket.ts => integ.kinfhss3-existing-logging-bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.existingStreamObj.expected.json => integ.kinfhss3-existingStreamObj.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.existingStreamObj.ts => integ.kinfhss3-existingStreamObj.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.no-arguments.expected.json => integ.kinfhss3-no-arguments.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/{integ.no-arguments.ts => integ.kinfhss3-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/{integ.existing.expected.json => integ.kinlam-existing.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/{integ.existing.ts => integ.kinlam-existing.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/{integ.no-arguments.expected.json => integ.kinlam-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/{integ.no-arguments.ts => integ.kinlam-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.add-secondary-index.expected.json => integ.lamddb-add-secondary-index.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.add-secondary-index.ts => integ.lamddb-add-secondary-index.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.deployFunctionWithExistingVpc.expected.json => integ.lamddb-deployFunctionWithExistingVpc.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.deployFunctionWithExistingVpc.ts => integ.lamddb-deployFunctionWithExistingVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.deployFunctionWithVpc.expected.json => integ.lamddb-deployFunctionWithVpc.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.deployFunctionWithVpc.ts => integ.lamddb-deployFunctionWithVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.no-arguments.expected.json => integ.lamddb-no-arguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.no-arguments.ts => integ.lamddb-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.set-billing-mode.expected.json => integ.lamddb-set-billing-mode.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.set-billing-mode.ts => integ.lamddb-set-billing-mode.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.use-existing-func.expected.json => integ.lamddb-use-existing-func.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/{integ.use-existing-func.ts => integ.lamddb-use-existing-func.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/{integ.existingResources.expected.json => integ.lammem-existingResources.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/{integ.existingResources.ts => integ.lammem-existingResources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/{integ.newResources.expected.json => integ.lammem-newResources.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/{integ.newResources.ts => integ.lammem-newResources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/{integ.withClientProps.expected.json => integ.lammem-withClientProps.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/{integ.withClientProps.ts => integ.lammem-withClientProps.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.deployFunctionWithClusterConfig.expected.json => integ.lamels-deployFunctionWithClusterConfig.expected.json} (97%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.deployFunctionWithClusterConfig.ts => integ.lamels-deployFunctionWithClusterConfig.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.deployFunctionWithExistingVpc.expected.json => integ.lamels-deployFunctionWithExistingVpc.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.deployFunctionWithExistingVpc.ts => integ.lamels-deployFunctionWithExistingVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.deployFunctionWithVpcProps.expected.json => integ.lamels-deployFunctionWithVpcProps.expected.json} (97%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.deployFunctionWithVpcProps.ts => integ.lamels-deployFunctionWithVpcProps.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.deployToFiveZones.expected.json => integ.lamels-deployToFiveZones.expected.json} (97%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.deployToFiveZones.ts => integ.lamels-deployToFiveZones.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.disabledZoneAwareness.expected.json => integ.lamels-disabledZoneAwareness.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.disabledZoneAwareness.ts => integ.lamels-disabledZoneAwareness.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.domain-arguments.expected.json => integ.lamels-domain-arguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.domain-arguments.ts => integ.lamels-domain-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.no-arguments.expected.json => integ.lamels-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/{integ.no-arguments.ts => integ.lamels-no-arguments.ts} (93%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.deployFunction.expected.json => integ.lamevt-deployFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.deployFunction.ts => integ.lamevt-deployFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.deployFunctionWithNewEventBus.expected.json => integ.lamevt-deployFunctionWithNewEventBus.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.deployFunctionWithNewEventBus.ts => integ.lamevt-deployFunctionWithNewEventBus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.deployFunctionWithVpc.expected.json => integ.lamevt-deployFunctionWithVpc.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.deployFunctionWithVpc.ts => integ.lamevt-deployFunctionWithVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.existingEventBus.expected.json => integ.lamevt-existingEventBus.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.existingEventBus.ts => integ.lamevt-existingEventBus.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.existingFunction.expected.json => integ.lamevt-existingFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/{integ.existingFunction.ts => integ.lamevt-existingFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/{integ.minimal-arguments.expected.json => integ.lamken-minimal-arguments.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/{integ.minimal-arguments.ts => integ.lamken-minimal-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/{integ.multiple-sources.expected.json => integ.lamken-multiple-sources.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/{integ.multiple-sources.ts => integ.lamken-multiple-sources.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/{integ.with-vpc.expected.json => integ.lamken-with-vpc.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/{integ.with-vpc.ts => integ.lamken-with-vpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/{integ.existing-function.expected.json => integ.lamfhs-existing-function.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/{integ.existing-function.ts => integ.lamfhs-existing-function.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/{integ.existing-vpc.expected.json => integ.lamfhs-existing-vpc.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/{integ.existing-vpc.ts => integ.lamfhs-existing-vpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/{integ.new-vpc.expected.json => integ.lamfhs-new-vpc.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/{integ.new-vpc.ts => integ.lamfhs-new-vpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/{integ.no-arguments.expected.json => integ.lamfhs-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/{integ.no-arguments.ts => integ.lamfhs-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.existingLambda.expected.json => integ.lamkin-existingLambda.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.existingLambda.ts => integ.lamkin-existingLambda.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.existingStream.expected.json => integ.lamkin-existingStream.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.existingStream.ts => integ.lamkin-existingStream.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.existingStreamWithCmk.expected.json => integ.lamkin-existingStreamWithCmk.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.existingStreamWithCmk.ts => integ.lamkin-existingStreamWithCmk.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.existingVpc.expected.json => integ.lamkin-existingVpc.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.existingVpc.ts => integ.lamkin-existingVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.newStreamFromProps.expected.json => integ.lamkin-newStreamFromProps.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.newStreamFromProps.ts => integ.lamkin-newStreamFromProps.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.newVpc.expected.json => integ.lamkin-newVpc.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.newVpc.ts => integ.lamkin-newVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.newVpcFromProps.expected.json => integ.lamkin-newVpcFromProps.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.newVpcFromProps.ts => integ.lamkin-newVpcFromProps.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.noArguments.expected.json => integ.lamkin-noArguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/{integ.noArguments.ts => integ.lamkin-noArguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.cluster-config.expected.json => integ.lamopn-cluster-config.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.cluster-config.ts => integ.lamopn-cluster-config.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.disabled-zone-awareness.expected.json => integ.lamopn-disabled-zone-awareness.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.disabled-zone-awareness.ts => integ.lamopn-disabled-zone-awareness.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.domain-arguments.expected.json => integ.lamopn-domain-arguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.domain-arguments.ts => integ.lamopn-domain-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.existing-vpc.expected.json => integ.lamopn-existing-vpc.expected.json} (96%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.existing-vpc.ts => integ.lamopn-existing-vpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.no-arguments.expected.json => integ.lamopn-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.no-arguments.ts => integ.lamopn-no-arguments.ts} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.vpc-props.expected.json => integ.lamopn-vpc-props.expected.json} (97%) rename source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/{integ.vpc-props.ts => integ.lamopn-vpc-props.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.customLoggingBucket.expected.json => integ.lams3-customLoggingBucket.expected.json} (77%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.customLoggingBucket.ts => integ.lams3-customLoggingBucket.ts} (98%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.deployFunction.expected.json => integ.lams3-deployFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.deployFunction.ts => integ.lams3-deployFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.deployFunctionWithVpc.expected.json => integ.lams3-deployFunctionWithVpc.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.deployFunctionWithVpc.ts => integ.lams3-deployFunctionWithVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.existingFunction.expected.json => integ.lams3-existingFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.existingFunction.ts => integ.lams3-existingFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.pre-existing-bucket.expected.json => integ.lams3-pre-existing-bucket.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/{integ.pre-existing-bucket.ts => integ.lams3-pre-existing-bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/{integ.deployFunction.expected.json => integ.lamsag-deployFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/{integ.deployFunction.ts => integ.lamsag-deployFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/{integ.existingFunction.expected.json => integ.lamsag-existingFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/{integ.existingFunction.ts => integ.lamsag-existingFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/{integ.existingSageMakerEndpoint.expected.json => integ.lamsag-existingSageMakerEndpoint.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/{integ.existingSageMakerEndpoint.ts => integ.lamsag-existingSageMakerEndpoint.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/{integ.deployFunction.expected.json => integ.lamsec-deployFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/{integ.deployFunction.ts => integ.lamsec-deployFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/{integ.deployFunctionWithExistingVpc.expected.json => integ.lamsec-deployFunctionWithExistingVpc.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/{integ.deployFunctionWithExistingVpc.ts => integ.lamsec-deployFunctionWithExistingVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/{integ.deployFunctionWithVpc.expected.json => integ.lamsec-deployFunctionWithVpc.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/{integ.deployFunctionWithVpc.ts => integ.lamsec-deployFunctionWithVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/{integ.existingFunction.expected.json => integ.lamsec-existingFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/{integ.existingFunction.ts => integ.lamsec-existingFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/{integ.deployFunction.expected.json => integ.lamsns-deployFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/{integ.deployFunction.ts => integ.lamsns-deployFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/{integ.deployFunctionWithVpc.expected.json => integ.lamsns-deployFunctionWithVpc.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/{integ.deployFunctionWithVpc.ts => integ.lamsns-deployFunctionWithVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/{integ.existingFunction.expected.json => integ.lamsns-existingFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/{integ.existingFunction.ts => integ.lamsns-existingFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.defaultDeployment.expected.json => integ.lamsqslam-defaultDeployment.expected.json} (99%) mode change 100755 => 100644 rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.defaultDeployment.ts => integ.lamsqslam-defaultDeployment.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.deployProducerFunctionWithVpc.expected.json => integ.lamsqslam-deployProducerFunctionWithVpc.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.deployProducerFunctionWithVpc.ts => integ.lamsqslam-deployProducerFunctionWithVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.existingConsumerFunction.expected.json => integ.lamsqslam-existingConsumerFunction.expected.json} (99%) mode change 100755 => 100644 rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.existingConsumerFunction.ts => integ.lamsqslam-existingConsumerFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.existingProducerFunction.expected.json => integ.lamsqslam-existingProducerFunction.expected.json} (99%) mode change 100755 => 100644 rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.existingProducerFunction.ts => integ.lamsqslam-existingProducerFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.existingQueue.expected.json => integ.lamsqslam-existingQueue.expected.json} (99%) mode change 100755 => 100644 rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/{integ.existingQueue.ts => integ.lamsqslam-existingQueue.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/{integ.deployFunction.expected.json => integ.lamsqs-deployFunction.expected.json} (100%) mode change 100755 => 100644 rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/{integ.deployFunction.ts => integ.lamsqs-deployFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/{integ.deployFunctionWithVpc.expected.json => integ.lamsqs-deployFunctionWithVpc.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/{integ.deployFunctionWithVpc.ts => integ.lamsqs-deployFunctionWithVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/{integ.existingFunction.expected.json => integ.lamsqs-existingFunction.expected.json} (100%) mode change 100755 => 100644 rename source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/{integ.existingFunction.ts => integ.lamsqs-existingFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.deployFunction.expected.json => integ.lamssm-deployFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.deployFunction.ts => integ.lamssm-deployFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.deployFunctionWithExistingVpc.expected.json => integ.lamssm-deployFunctionWithExistingVpc.expected.json} (92%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.deployFunctionWithExistingVpc.ts => integ.lamssm-deployFunctionWithExistingVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.deployFunctionWithVpc.expected.json => integ.lamssm-deployFunctionWithVpc.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.deployFunctionWithVpc.ts => integ.lamssm-deployFunctionWithVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.existingFunction.expected.json => integ.lamssm-existingFunction.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.existingFunction.ts => integ.lamssm-existingFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.existingStringParameter.expected.json => integ.lamssm-existingStringParameter.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/{integ.existingStringParameter.ts => integ.lamssm-existingStringParameter.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/{integ.deploy-lambda.expected.json => integ.lamstp-deploy-lambda.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/{integ.deploy-lambda.ts => integ.lamstp-deploy-lambda.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/{integ.deployFunctionWithVpc.expected.json => integ.lamstp-deployFunctionWithVpc.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/{integ.deployFunctionWithVpc.ts => integ.lamstp-deployFunctionWithVpc.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/{integ.existing-function.expected.json => integ.lamstp-existing-function.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/{integ.existing-function.ts => integ.lamstp-existing-function.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/{integ.apiFromAssetExistingLambdaFunctions.expected.json => integ.opilam-apiFromAssetExistingLambdaFunctions.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/{integ.apiFromAssetExistingLambdaFunctions.ts => integ.opilam-apiFromAssetExistingLambdaFunctions.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/{integ.apiFromAssetNewLambdaFunctions.expected.json => integ.opilam-apiFromAssetNewLambdaFunctions.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/{integ.apiFromAssetNewLambdaFunctions.ts => integ.opilam-apiFromAssetNewLambdaFunctions.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/{integ.apiFromAssetWithCognitoAuth.expected.json => integ.opilam-apiFromAssetWithCognitoAuth.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/{integ.apiFromAssetWithCognitoAuth.ts => integ.opilam-apiFromAssetWithCognitoAuth.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployPrivateApi.expected.json => integ.r53alb-deployPrivateApi.expected.json} (95%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployPrivateApi.ts => integ.r53alb-deployPrivateApi.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployPrivateApiExistingZone.expected.json => integ.r53alb-deployPrivateApiExistingZone.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployPrivateApiExistingZone.ts => integ.r53alb-deployPrivateApiExistingZone.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployPublicApiExistingAlb.expected.json => integ.r53alb-deployPublicApiExistingAlb.expected.json} (91%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployPublicApiExistingAlb.ts => integ.r53alb-deployPublicApiExistingAlb.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployPublicApiNewAlb.expected.json => integ.r53alb-deployPublicApiNewAlb.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployPublicApiNewAlb.ts => integ.r53alb-deployPublicApiNewAlb.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployWithoutLogging.expected.json => integ.r53alb-deployWithoutLogging.expected.json} (93%) rename source/patterns/@aws-solutions-constructs/aws-route53-alb/test/{integ.deployWithoutLogging.ts => integ.r53alb-deployWithoutLogging.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/{integ.dummyTest.expected.json => integ.r53api-dummyTest.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/{integ.dummyTest.ts => integ.r53api-dummyTest.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/{integ.existing-s3-bucket.expected.json => integ.s3lam-existing-s3-bucket.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/{integ.existing-s3-bucket.ts => integ.s3lam-existing-s3-bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/{integ.no-arguments.expected.json => integ.s3lam-no-arguments.expected.json} (84%) rename source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/{integ.no-arguments.ts => integ.s3lam-no-arguments.ts} (98%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.noArguments.expected.json => integ.s3sns-customLoggingBucket.expected.json} (84%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.customLoggingBucket.ts => integ.s3sns-customLoggingBucket.ts} (97%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.existingS3Bucket.expected.json => integ.s3sns-existingS3Bucket.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.existingS3Bucket.ts => integ.s3sns-existingS3Bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.existingSnsTopic.expected.json => integ.s3sns-existingSnsTopic.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.existingSnsTopic.ts => integ.s3sns-existingSnsTopic.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.existingUnencryptedSnsTopic.expected.json => integ.s3sns-existingUnencryptedSnsTopic.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.existingUnencryptedSnsTopic.ts => integ.s3sns-existingUnencryptedSnsTopic.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.newTopicFromProps.expected.json => integ.s3sns-newTopicFromProps.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.newTopicFromProps.ts => integ.s3sns-newTopicFromProps.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.customLoggingBucket.expected.json => integ.s3sns-noArguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.noArguments.ts => integ.s3sns-noArguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.s3EventTypesAndFilters.expected.json => integ.s3sns-s3EventTypesAndFilters.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.s3EventTypesAndFilters.ts => integ.s3sns-s3EventTypesAndFilters.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.snsTopicWithAwsManagedKey.expected.json => integ.s3sns-snsTopicWithAwsManagedKey.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sns/test/{integ.snsTopicWithAwsManagedKey.ts => integ.s3sns-snsTopicWithAwsManagedKey.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.creatingNewQueue.expected.json => integ.s3sqs-creatingNewQueue.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.creatingNewQueue.ts => integ.s3sqs-creatingNewQueue.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.customLoggingBucket.expected.json => integ.s3sqs-customLoggingBucket.expected.json} (86%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.customLoggingBucket.ts => integ.s3sqs-customLoggingBucket.ts} (97%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.existingLoggingBucket.expected.json => integ.s3sqs-existingLoggingBucket.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.existingLoggingBucket.ts => integ.s3sqs-existingLoggingBucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.existingQueue.expected.json => integ.s3sqs-existingQueue.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.existingQueue.ts => integ.s3sqs-existingQueue.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.existingS3Bucket.expected.json => integ.s3sqs-existingS3Bucket.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.existingS3Bucket.ts => integ.s3sqs-existingS3Bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.noArguments.expected.json => integ.s3sqs-noArguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/{integ.noArguments.ts => integ.s3sqs-noArguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/{integ.customLoggingBucket.expected.json => integ.s3stp-customLoggingBucket.expected.json} (88%) rename source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/{integ.customLoggingBucket.ts => integ.s3stp-customLoggingBucket.ts} (98%) rename source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/{integ.pre-existing-bucket.expected.json => integ.s3stp-pre-existing-bucket.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/{integ.pre-existing-bucket.ts => integ.s3stp-pre-existing-bucket.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/{integ.s3-stepfunctions-no-argument.expected.json => integ.s3stp-s3-stepfunctions-no-argument.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/{integ.s3-stepfunctions-no-argument.ts => integ.s3stp-s3-stepfunctions-no-argument.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/{integ.no-arguments.expected.json => integ.snslam-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/{integ.no-arguments.ts => integ.snslam-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.deployFIFOQueue.expected.json => integ.snssqs-deployFIFOQueue.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.deployFIFOQueue.ts => integ.snssqs-deployFIFOQueue.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.deployStandardQueue.expected.json => integ.snssqs-deployStandardQueue.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.deployStandardQueue.ts => integ.snssqs-deployStandardQueue.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.existing-kms-key.expected.json => integ.snssqs-existing-kms-key.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.existing-kms-key.ts => integ.snssqs-existing-kms-key.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.no-arguments.expected.json => integ.snssqs-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.no-arguments.ts => integ.snssqs-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.rawMessageDelivery.expected.json => integ.snssqs-rawMessageDelivery.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.rawMessageDelivery.ts => integ.snssqs-rawMessageDelivery.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.sns-existing-kms-key.expected.json => integ.snssqs-sns-existing-kms-key.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.sns-existing-kms-key.ts => integ.snssqs-sns-existing-kms-key.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.sns-managed-kms-key.expected.json => integ.snssqs-sns-managed-kms-key.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/{integ.sns-managed-kms-key.ts => integ.snssqs-sns-managed-kms-key.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/{integ.deployFifoQueue.expected.json => integ.sqslam-deployFifoQueue.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/{integ.deployFifoQueue.ts => integ.sqslam-deployFifoQueue.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/{integ.deployFunction.expected.json => integ.sqslam-deployFunction.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/{integ.deployFunction.ts => integ.sqslam-deployFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/{integ.existingFunction.expected.json => integ.sqslam-existingFunction.expected.json} (99%) rename source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/{integ.existingFunction.ts => integ.sqslam-existingFunction.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/{integ.no-arguments.expected.json => integ.wafalb-no-arguments.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/{integ.no-arguments.ts => integ.wafalb-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/{integ.existing-waf-to-multiple-gateways.expected.json => integ.wafapi-existing-waf-to-multiple-gateways.expected.json} (97%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/{integ.existing-waf-to-multiple-gateways.ts => integ.wafapi-existing-waf-to-multiple-gateways.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/{integ.no-arguments.expected.json => integ.wafapi-no-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/{integ.no-arguments.ts => integ.wafapi-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/{integ.partial-arguments.expected.json => integ.wafapi-partial-arguments.expected.json} (98%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/{integ.partial-arguments.ts => integ.wafapi-partial-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/{integ.no-arguments.expected.json => integ.wafaps-no-arguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/{integ.no-arguments.ts => integ.wafaps-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/{integ.partial-arguments.expected.json => integ.wafaps-partial-arguments.expected.json} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/{integ.partial-arguments.ts => integ.wafaps-partial-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/{integ.existing-waf-to-multiple-cloudfront.expected.json => integ.wafcft-existing-waf-to-multiple-cloudfront.expected.json} (89%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/{integ.existing-waf-to-multiple-cloudfront.ts => integ.wafcft-existing-waf-to-multiple-cloudfront.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/{integ.no-arguments.expected.json => integ.wafcft-no-arguments.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/{integ.no-arguments.ts => integ.wafcft-no-arguments.ts} (100%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/{integ.partial-arguments.expected.json => integ.wafcft-partial-arguments.expected.json} (94%) rename source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/{integ.partial-arguments.ts => integ.wafcft-partial-arguments.ts} (100%) diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-existing-private-http.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json rename to source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-existing-private-http.expected.json index db34b0132..233ea53d7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-existing-private-http.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc" + "Value": "albfar-all-existing-private-http/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet1" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet1" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet1" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet1" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet2" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet2" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet2" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet2" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet3" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet3" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet3" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PublicSubnet3" + "Value": "albfar-all-existing-private-http/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PrivateSubnet1" + "Value": "albfar-all-existing-private-http/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PrivateSubnet1" + "Value": "albfar-all-existing-private-http/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PrivateSubnet2" + "Value": "albfar-all-existing-private-http/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PrivateSubnet2" + "Value": "albfar-all-existing-private-http/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PrivateSubnet3" + "Value": "albfar-all-existing-private-http/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/PrivateSubnet3" + "Value": "albfar-all-existing-private-http/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc" + "Value": "albfar-all-existing-private-http/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/FlowLog" + "Value": "albfar-all-existing-private-http/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/FlowLog" + "Value": "albfar-all-existing-private-http/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-existing-private-http/Vpc/FlowLog" + "Value": "albfar-all-existing-private-http/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "allexistingprivatehttpECRAPIsecuritygroupD77FBBD5", + "albfarallexistingprivatehttpECRAPIsecuritygroup3F53A4F6", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "allexistingprivatehttpECRDKRsecuritygroup04338671", + "albfarallexistingprivatehttpECRDKRsecuritygroup2769317C", "GroupId" ] } @@ -771,10 +771,10 @@ } } }, - "allexistingprivatehttpECRAPIsecuritygroupD77FBBD5": { + "albfarallexistingprivatehttpECRAPIsecuritygroup3F53A4F6": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "all-existing-private-http/all-existing-private-http-ECR_API-security-group", + "GroupDescription": "albfar-all-existing-private-http/albfar-all-existing-private-http-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -829,10 +829,10 @@ } } }, - "allexistingprivatehttpECRDKRsecuritygroup04338671": { + "albfarallexistingprivatehttpECRDKRsecuritygroup2769317C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "all-existing-private-http/all-existing-private-http-ECR_DKR-security-group", + "GroupDescription": "albfar-all-existing-private-http/albfar-all-existing-private-http-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -925,7 +925,7 @@ } ], "Cpu": "256", - "Family": "allexistingprivatehttptesttaskdefFB96B83E", + "Family": "albfarallexistingprivatehttptesttaskdefC73C7852", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -969,7 +969,7 @@ } } }, - "testsgfromallexistingprivatehttptestalbSecurityGroup4B36914B80803EB3A82F": { + "testsgfromalbfarallexistingprivatehttptestalbSecurityGroupAC4D388D8080E8480E9E": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { "Description": "Load balancer to target", @@ -1105,7 +1105,7 @@ "testalbSecurityGroup0C84CDF9": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB allexistingprivatehttptestalbFA71009A", + "GroupDescription": "Automatically created Security Group for ELB albfarallexistingprivatehttptestalb104FD1D4", "SecurityGroupIngress": [ { "CidrIp": "0.0.0.0/0", @@ -1138,7 +1138,7 @@ } } }, - "testalbSecurityGrouptoallexistingprivatehttptestsgC280D41D8080C6A2C196": { + "testalbSecurityGrouptoalbfarallexistingprivatehttptestsgD60B2013808013EE9793": { "Type": "AWS::EC2::SecurityGroupEgress", "Properties": { "Description": "Load balancer to target", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-existing-private-http.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-existing-private-http.ts rename to source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-existing-private-http.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-public-http.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json rename to source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-public-http.expected.json index 5f1ba0d9d..19cd44101 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-public-http.expected.json @@ -42,7 +42,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc" + "Value": "albfar-all-new-public-http/Vpc" } ] } @@ -64,7 +64,7 @@ }, { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet1" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet1" } ], "VpcId": { @@ -88,7 +88,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet1" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet1" } ], "VpcId": { @@ -129,7 +129,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet1" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet1" } ] } @@ -149,7 +149,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet1" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet1" } ] }, @@ -175,7 +175,7 @@ }, { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet2" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet2" } ], "VpcId": { @@ -199,7 +199,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet2" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet2" } ], "VpcId": { @@ -240,7 +240,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet2" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet2" } ] } @@ -260,7 +260,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet2" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet2" } ] }, @@ -286,7 +286,7 @@ }, { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet3" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet3" } ], "VpcId": { @@ -310,7 +310,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet3" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet3" } ], "VpcId": { @@ -351,7 +351,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet3" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet3" } ] } @@ -371,7 +371,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PublicSubnet3" + "Value": "albfar-all-new-public-http/Vpc/PublicSubnet3" } ] }, @@ -397,7 +397,7 @@ }, { "Key": "Name", - "Value": "all-new-public-http/Vpc/PrivateSubnet1" + "Value": "albfar-all-new-public-http/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -411,7 +411,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PrivateSubnet1" + "Value": "albfar-all-new-public-http/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -459,7 +459,7 @@ }, { "Key": "Name", - "Value": "all-new-public-http/Vpc/PrivateSubnet2" + "Value": "albfar-all-new-public-http/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -473,7 +473,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PrivateSubnet2" + "Value": "albfar-all-new-public-http/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -521,7 +521,7 @@ }, { "Key": "Name", - "Value": "all-new-public-http/Vpc/PrivateSubnet3" + "Value": "albfar-all-new-public-http/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -535,7 +535,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/PrivateSubnet3" + "Value": "albfar-all-new-public-http/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -572,7 +572,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc" + "Value": "albfar-all-new-public-http/Vpc" } ] } @@ -606,7 +606,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/FlowLog" + "Value": "albfar-all-new-public-http/Vpc/FlowLog" } ] } @@ -658,7 +658,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/FlowLog" + "Value": "albfar-all-new-public-http/Vpc/FlowLog" } ] }, @@ -695,7 +695,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-public-http/Vpc/FlowLog" + "Value": "albfar-all-new-public-http/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -708,7 +708,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "allnewpublichttpECRAPIsecuritygroup764A5BEA", + "albfarallnewpublichttpECRAPIsecuritygroupC34307CE", "GroupId" ] } @@ -738,7 +738,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "allnewpublichttpECRDKRsecuritygroup0DCDEE57", + "albfarallnewpublichttpECRDKRsecuritygroup310B1E0F", "GroupId" ] } @@ -862,7 +862,7 @@ "testconstructlbalbSecurityGroup5F187AF4": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB allnewpublichttptestconstructlbalb44DAC1E9", + "GroupDescription": "Automatically created Security Group for ELB albfarallnewpublichttptestconstructlbalbEC3675DA", "SecurityGroupIngress": [ { "CidrIp": "0.0.0.0/0", @@ -900,7 +900,7 @@ } } }, - "testconstructlbalbSecurityGrouptoallnewpublichttptestconstructsgEFBACDED8080226DB910": { + "testconstructlbalbSecurityGrouptoalbfarallnewpublichttptestconstructsg1860422C8080865548FA": { "Type": "AWS::EC2::SecurityGroupEgress", "Properties": { "Description": "Load balancer to target", @@ -1011,6 +1011,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -1179,7 +1180,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1226,10 +1227,10 @@ } } }, - "allnewpublichttpECRAPIsecuritygroup764A5BEA": { + "albfarallnewpublichttpECRAPIsecuritygroupC34307CE": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "all-new-public-http/all-new-public-http-ECR_API-security-group", + "GroupDescription": "albfar-all-new-public-http/albfar-all-new-public-http-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1284,10 +1285,10 @@ } } }, - "allnewpublichttpECRDKRsecuritygroup0DCDEE57": { + "albfarallnewpublichttpECRDKRsecuritygroup310B1E0F": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "all-new-public-http/all-new-public-http-ECR_DKR-security-group", + "GroupDescription": "albfar-all-new-public-http/albfar-all-new-public-http-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1380,7 +1381,7 @@ } ], "Cpu": "256", - "Family": "allnewpublichttptestconstructtaskdefDF932EBD", + "Family": "albfarallnewpublichttptestconstructtaskdef366971AB", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1424,7 +1425,7 @@ } } }, - "testconstructsgfromallnewpublichttptestconstructlbalbSecurityGroupA1A7ABDB8080D3FFEE20": { + "testconstructsgfromalbfarallnewpublichttptestconstructlbalbSecurityGroupBF68816E808021766483": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { "Description": "Load balancer to target", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-public-http.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.ts rename to source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-public-http.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json rename to source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.expected.json index 8a08f7628..d99620bf3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.expected.json @@ -32,7 +32,7 @@ } } }, - "testconstructtestconstructlistenerallnewtwotargetstargetsRule897FD7B6": { + "testconstructtestconstructlisteneralbfarallnewtwotargetstargetsRule9ADF76CF": { "Type": "AWS::ElasticLoadBalancingV2::ListenerRule", "Properties": { "Actions": [ @@ -69,7 +69,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc" + "Value": "albfar-all-new-two-targets/Vpc" } ] } @@ -91,7 +91,7 @@ }, { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet1" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet1" } ], "VpcId": { @@ -115,7 +115,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet1" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet1" } ], "VpcId": { @@ -156,7 +156,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet1" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet1" } ] } @@ -176,7 +176,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet1" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet1" } ] }, @@ -202,7 +202,7 @@ }, { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet2" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet2" } ], "VpcId": { @@ -226,7 +226,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet2" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet2" } ], "VpcId": { @@ -267,7 +267,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet2" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet2" } ] } @@ -287,7 +287,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet2" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet2" } ] }, @@ -313,7 +313,7 @@ }, { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet3" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet3" } ], "VpcId": { @@ -337,7 +337,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet3" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet3" } ], "VpcId": { @@ -378,7 +378,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet3" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet3" } ] } @@ -398,7 +398,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PublicSubnet3" + "Value": "albfar-all-new-two-targets/Vpc/PublicSubnet3" } ] }, @@ -424,7 +424,7 @@ }, { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PrivateSubnet1" + "Value": "albfar-all-new-two-targets/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -438,7 +438,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PrivateSubnet1" + "Value": "albfar-all-new-two-targets/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -486,7 +486,7 @@ }, { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PrivateSubnet2" + "Value": "albfar-all-new-two-targets/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -500,7 +500,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PrivateSubnet2" + "Value": "albfar-all-new-two-targets/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -548,7 +548,7 @@ }, { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PrivateSubnet3" + "Value": "albfar-all-new-two-targets/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -562,7 +562,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/PrivateSubnet3" + "Value": "albfar-all-new-two-targets/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -599,7 +599,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc" + "Value": "albfar-all-new-two-targets/Vpc" } ] } @@ -633,7 +633,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/FlowLog" + "Value": "albfar-all-new-two-targets/Vpc/FlowLog" } ] } @@ -685,7 +685,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/FlowLog" + "Value": "albfar-all-new-two-targets/Vpc/FlowLog" } ] }, @@ -722,7 +722,7 @@ "Tags": [ { "Key": "Name", - "Value": "all-new-two-targets/Vpc/FlowLog" + "Value": "albfar-all-new-two-targets/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -735,7 +735,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "allnewtwotargetsECRAPIsecuritygroupCC5C870C", + "albfarallnewtwotargetsECRAPIsecuritygroup47B0559C", "GroupId" ] } @@ -765,7 +765,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "allnewtwotargetsECRDKRsecuritygroup3CC9849F", + "albfarallnewtwotargetsECRDKRsecuritygroup4F68E980", "GroupId" ] } @@ -889,7 +889,7 @@ "testconstructlbalbSecurityGroup5F187AF4": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB allnewtwotargetstestconstructlbalb803F4823", + "GroupDescription": "Automatically created Security Group for ELB albfarallnewtwotargetstestconstructlbalb5E943C48", "SecurityGroupIngress": [ { "CidrIp": "0.0.0.0/0", @@ -927,7 +927,7 @@ } } }, - "testconstructlbalbSecurityGrouptoallnewtwotargetstestconstructsgCB4347D58080785349CD": { + "testconstructlbalbSecurityGrouptoalbfarallnewtwotargetstestconstructsg36F923248080B80B6D0D": { "Type": "AWS::EC2::SecurityGroupEgress", "Properties": { "Description": "Load balancer to target", @@ -1038,6 +1038,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -1206,7 +1207,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1253,10 +1254,10 @@ } } }, - "allnewtwotargetsECRAPIsecuritygroupCC5C870C": { + "albfarallnewtwotargetsECRAPIsecuritygroup47B0559C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "all-new-two-targets/all-new-two-targets-ECR_API-security-group", + "GroupDescription": "albfar-all-new-two-targets/albfar-all-new-two-targets-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1311,10 +1312,10 @@ } } }, - "allnewtwotargetsECRDKRsecuritygroup3CC9849F": { + "albfarallnewtwotargetsECRDKRsecuritygroup4F68E980": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "all-new-two-targets/all-new-two-targets-ECR_DKR-security-group", + "GroupDescription": "albfar-all-new-two-targets/albfar-all-new-two-targets-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1407,7 +1408,7 @@ } ], "Cpu": "256", - "Family": "allnewtwotargetstestconstructtaskdef8EF55A85", + "Family": "albfarallnewtwotargetstestconstructtaskdef27EF52BC", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1451,7 +1452,7 @@ } } }, - "testconstructsgfromallnewtwotargetstestconstructlbalbSecurityGroup7AE13AD9808027E2CC4F": { + "testconstructsgfromalbfarallnewtwotargetstestconstructlbalbSecurityGroup07EB9DFC8080E399C8E0": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { "Description": "Load balancer to target", @@ -1538,7 +1539,7 @@ }, "DependsOn": [ "testconstructtaskdefTaskRoleC60414C4", - "testconstructtestconstructlistenerallnewtwotargetstargetsRule897FD7B6", + "testconstructtestconstructlisteneralbfarallnewtwotargetstargetsRule9ADF76CF", "testconstructtestconstructlistener484444F1" ] }, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.ts b/source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.ts rename to source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiExistingResources.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiExistingResources.expected.json index ebe2a257f..a9808d6dd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiExistingResources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc" + "Value": "alblam-privateApiExistingResources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet1" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet1" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet1" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet1" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet2" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet2" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet2" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet2" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet3" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet3" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet3" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PublicSubnet3" + "Value": "alblam-privateApiExistingResources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PrivateSubnet1" + "Value": "alblam-privateApiExistingResources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PrivateSubnet1" + "Value": "alblam-privateApiExistingResources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PrivateSubnet2" + "Value": "alblam-privateApiExistingResources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PrivateSubnet2" + "Value": "alblam-privateApiExistingResources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PrivateSubnet3" + "Value": "alblam-privateApiExistingResources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/PrivateSubnet3" + "Value": "alblam-privateApiExistingResources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc" + "Value": "alblam-privateApiExistingResources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/FlowLog" + "Value": "alblam-privateApiExistingResources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/FlowLog" + "Value": "alblam-privateApiExistingResources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiExistingResources/Vpc/FlowLog" + "Value": "alblam-privateApiExistingResources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -673,7 +673,7 @@ "lambdasg93781054": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "privateApiExistingResources/lambda-sg", + "GroupDescription": "alblam-privateApiExistingResources/lambda-sg", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -949,7 +949,7 @@ "existingalbalbSecurityGroupC8DD2920": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB privateApiExistingResourcesexistingalbalbC2B8FCB6", + "GroupDescription": "Automatically created Security Group for ELB alblamprivateApiExistingResourcesexistingalbalb9103CE08", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -1081,6 +1081,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -1249,7 +1250,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiExistingResources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.ts rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiExistingResources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiNewResources.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiNewResources.expected.json index c24fba1c8..0247f376a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiNewResources.expected.json @@ -55,7 +55,7 @@ "testonetestonealbSecurityGroup4DED9E2A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB privateApiNewResourcestestonetestonealbAC549B81", + "GroupDescription": "Automatically created Security Group for ELB alblamprivateApiNewResourcestestonetestonealb8D3CF023", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -187,6 +187,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -429,7 +430,7 @@ "testoneReplaceDefaultSecurityGroupsecuritygroupE46270FE": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "privateApiNewResources/test-one/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "alblam-privateApiNewResources/test-one/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -607,7 +608,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc" + "Value": "alblam-privateApiNewResources/Vpc" } ] } @@ -629,7 +630,7 @@ }, { "Key": "Name", - "Value": "privateApiNewResources/Vpc/isolatedSubnet1" + "Value": "alblam-privateApiNewResources/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -643,7 +644,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc/isolatedSubnet1" + "Value": "alblam-privateApiNewResources/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -679,7 +680,7 @@ }, { "Key": "Name", - "Value": "privateApiNewResources/Vpc/isolatedSubnet2" + "Value": "alblam-privateApiNewResources/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -693,7 +694,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc/isolatedSubnet2" + "Value": "alblam-privateApiNewResources/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -729,7 +730,7 @@ }, { "Key": "Name", - "Value": "privateApiNewResources/Vpc/isolatedSubnet3" + "Value": "alblam-privateApiNewResources/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -743,7 +744,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc/isolatedSubnet3" + "Value": "alblam-privateApiNewResources/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -780,7 +781,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc/FlowLog" + "Value": "alblam-privateApiNewResources/Vpc/FlowLog" } ] } @@ -832,7 +833,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc/FlowLog" + "Value": "alblam-privateApiNewResources/Vpc/FlowLog" } ] }, @@ -869,7 +870,7 @@ "Tags": [ { "Key": "Name", - "Value": "privateApiNewResources/Vpc/FlowLog" + "Value": "alblam-privateApiNewResources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -904,7 +905,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiNewResources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.ts rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiNewResources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiExistingResources.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiExistingResources.expected.json index ef2fc7821..895a53a72 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiExistingResources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc" + "Value": "alblam-publicApiExistingResources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet1" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet1" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet1" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet1" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet2" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet2" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet2" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet2" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet3" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet3" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet3" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PublicSubnet3" + "Value": "alblam-publicApiExistingResources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PrivateSubnet1" + "Value": "alblam-publicApiExistingResources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PrivateSubnet1" + "Value": "alblam-publicApiExistingResources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PrivateSubnet2" + "Value": "alblam-publicApiExistingResources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PrivateSubnet2" + "Value": "alblam-publicApiExistingResources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PrivateSubnet3" + "Value": "alblam-publicApiExistingResources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/PrivateSubnet3" + "Value": "alblam-publicApiExistingResources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc" + "Value": "alblam-publicApiExistingResources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/FlowLog" + "Value": "alblam-publicApiExistingResources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/FlowLog" + "Value": "alblam-publicApiExistingResources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiExistingResources/Vpc/FlowLog" + "Value": "alblam-publicApiExistingResources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -673,7 +673,7 @@ "lambdasg93781054": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "publicApiExistingResources/lambda-sg", + "GroupDescription": "alblam-publicApiExistingResources/lambda-sg", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -949,7 +949,7 @@ "existingalbalbSecurityGroupC8DD2920": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB publicApiExistingResourcesexistingalbalb2415E979", + "GroupDescription": "Automatically created Security Group for ELB alblampublicApiExistingResourcesexistingalbalb1EA1EAA3", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -1081,6 +1081,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -1249,7 +1250,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiExistingResources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.ts rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiExistingResources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiNewResources.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiNewResources.expected.json index b6c7be27d..b790b7365 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiNewResources.expected.json @@ -61,7 +61,7 @@ "testonetestonealbSecurityGroup4DED9E2A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB publicApiNewResourcestestonetestonealb8536470B", + "GroupDescription": "Automatically created Security Group for ELB alblampublicApiNewResourcestestonetestonealbE07397A7", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -193,6 +193,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -435,7 +436,7 @@ "testoneReplaceDefaultSecurityGroupsecuritygroupE46270FE": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "publicApiNewResources/test-one/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "alblam-publicApiNewResources/test-one/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -619,7 +620,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc" + "Value": "alblam-publicApiNewResources/Vpc" } ] } @@ -641,7 +642,7 @@ }, { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet1" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -665,7 +666,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet1" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -706,7 +707,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet1" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet1" } ] } @@ -726,7 +727,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet1" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet1" } ] }, @@ -752,7 +753,7 @@ }, { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet2" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -776,7 +777,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet2" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -817,7 +818,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet2" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet2" } ] } @@ -837,7 +838,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet2" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet2" } ] }, @@ -863,7 +864,7 @@ }, { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet3" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -887,7 +888,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet3" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -928,7 +929,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet3" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet3" } ] } @@ -948,7 +949,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PublicSubnet3" + "Value": "alblam-publicApiNewResources/Vpc/PublicSubnet3" } ] }, @@ -974,7 +975,7 @@ }, { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PrivateSubnet1" + "Value": "alblam-publicApiNewResources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -988,7 +989,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PrivateSubnet1" + "Value": "alblam-publicApiNewResources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -1036,7 +1037,7 @@ }, { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PrivateSubnet2" + "Value": "alblam-publicApiNewResources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1050,7 +1051,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PrivateSubnet2" + "Value": "alblam-publicApiNewResources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1098,7 +1099,7 @@ }, { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PrivateSubnet3" + "Value": "alblam-publicApiNewResources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1112,7 +1113,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/PrivateSubnet3" + "Value": "alblam-publicApiNewResources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1149,7 +1150,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc" + "Value": "alblam-publicApiNewResources/Vpc" } ] } @@ -1183,7 +1184,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/FlowLog" + "Value": "alblam-publicApiNewResources/Vpc/FlowLog" } ] } @@ -1235,7 +1236,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/FlowLog" + "Value": "alblam-publicApiNewResources/Vpc/FlowLog" } ] }, @@ -1272,7 +1273,7 @@ "Tags": [ { "Key": "Name", - "Value": "publicApiNewResources/Vpc/FlowLog" + "Value": "alblam-publicApiNewResources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1307,7 +1308,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiNewResources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.ts rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiNewResources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-twoTargets.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-twoTargets.expected.json index 447e2e805..01a5ffba8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-twoTargets.expected.json @@ -61,7 +61,7 @@ "testonetestonealbSecurityGroup4DED9E2A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB twoTargetstestonetestonealbB0E5AEF9", + "GroupDescription": "Automatically created Security Group for ELB alblamtwoTargetstestonetestonealbCEEAAF66", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -193,6 +193,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -435,7 +436,7 @@ "testoneReplaceDefaultSecurityGroupsecuritygroupE46270FE": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "twoTargets/test-one/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "alblam-twoTargets/test-one/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -646,7 +647,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc" + "Value": "alblam-twoTargets/Vpc" } ] } @@ -668,7 +669,7 @@ }, { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet1" + "Value": "alblam-twoTargets/Vpc/PublicSubnet1" } ], "VpcId": { @@ -692,7 +693,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet1" + "Value": "alblam-twoTargets/Vpc/PublicSubnet1" } ], "VpcId": { @@ -733,7 +734,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet1" + "Value": "alblam-twoTargets/Vpc/PublicSubnet1" } ] } @@ -753,7 +754,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet1" + "Value": "alblam-twoTargets/Vpc/PublicSubnet1" } ] }, @@ -779,7 +780,7 @@ }, { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet2" + "Value": "alblam-twoTargets/Vpc/PublicSubnet2" } ], "VpcId": { @@ -803,7 +804,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet2" + "Value": "alblam-twoTargets/Vpc/PublicSubnet2" } ], "VpcId": { @@ -844,7 +845,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet2" + "Value": "alblam-twoTargets/Vpc/PublicSubnet2" } ] } @@ -864,7 +865,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet2" + "Value": "alblam-twoTargets/Vpc/PublicSubnet2" } ] }, @@ -890,7 +891,7 @@ }, { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet3" + "Value": "alblam-twoTargets/Vpc/PublicSubnet3" } ], "VpcId": { @@ -914,7 +915,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet3" + "Value": "alblam-twoTargets/Vpc/PublicSubnet3" } ], "VpcId": { @@ -955,7 +956,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet3" + "Value": "alblam-twoTargets/Vpc/PublicSubnet3" } ] } @@ -975,7 +976,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PublicSubnet3" + "Value": "alblam-twoTargets/Vpc/PublicSubnet3" } ] }, @@ -1001,7 +1002,7 @@ }, { "Key": "Name", - "Value": "twoTargets/Vpc/PrivateSubnet1" + "Value": "alblam-twoTargets/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -1015,7 +1016,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PrivateSubnet1" + "Value": "alblam-twoTargets/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -1063,7 +1064,7 @@ }, { "Key": "Name", - "Value": "twoTargets/Vpc/PrivateSubnet2" + "Value": "alblam-twoTargets/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1077,7 +1078,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PrivateSubnet2" + "Value": "alblam-twoTargets/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1125,7 +1126,7 @@ }, { "Key": "Name", - "Value": "twoTargets/Vpc/PrivateSubnet3" + "Value": "alblam-twoTargets/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1139,7 +1140,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/PrivateSubnet3" + "Value": "alblam-twoTargets/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1176,7 +1177,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc" + "Value": "alblam-twoTargets/Vpc" } ] } @@ -1210,7 +1211,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/FlowLog" + "Value": "alblam-twoTargets/Vpc/FlowLog" } ] } @@ -1262,7 +1263,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/FlowLog" + "Value": "alblam-twoTargets/Vpc/FlowLog" } ] }, @@ -1299,7 +1300,7 @@ "Tags": [ { "Key": "Name", - "Value": "twoTargets/Vpc/FlowLog" + "Value": "alblam-twoTargets/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1334,7 +1335,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1484,7 +1485,7 @@ "testtwoReplaceDefaultSecurityGroupsecuritygroupE62CC6C1": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "twoTargets/test-two/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "alblam-twoTargets/test-two/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.ts b/source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-twoTargets.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.ts rename to source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-twoTargets.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates-custom-resource-name.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates-custom-resource-name.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates-custom-resource-name.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates-custom-resource-name.expected.json index 782a0bdc5..3469d6b9c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates-custom-resource-name.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates-custom-resource-name.expected.json @@ -4,27 +4,27 @@ "existingtableE51CCC93": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "PK", - "KeyType": "HASH" + "AttributeType": "S" }, { "AttributeName": "SK", - "KeyType": "RANGE" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "PK", - "AttributeType": "S" + "KeyType": "HASH" }, { "AttributeName": "SK", - "AttributeType": "S" + "KeyType": "RANGE" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -68,10 +68,10 @@ "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiDeployment7F5497B67361a1e02c5799cae81447bf3ad5ef46": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiC4813ABE" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiidGETB657BB05", @@ -91,9 +91,6 @@ "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiDeploymentStageprodDD2DED0B": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiC4813ABE" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -114,6 +111,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiC4813ABE" + }, "StageName": "prod", "TracingEnabled": true } @@ -136,14 +136,8 @@ "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiidGETB657BB05": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiid4EBF99AB" - }, - "RestApiId": { - "Ref": "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiC4813ABE" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -225,7 +219,13 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Ref": "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiid4EBF99AB" + }, + "RestApiId": { + "Ref": "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiC4813ABE" + } } }, "testapigatewaydynamodbadditionalrequesttemplatescustomresourcenameRestApiUsagePlan4D14DF10": { @@ -423,4 +423,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates-custom-resource-name.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates-custom-resource-name.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates-custom-resource-name.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates-custom-resource-name.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates.expected.json index 8a7cb091d..cbb85b914 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates.expected.json @@ -4,19 +4,19 @@ "existingtableE51CCC93": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -60,10 +60,10 @@ "testapigatewaydynamodbadditionalrequesttemplatesRestApiDeployment0AE7C47741477f52c0bb6da128d2999e75c543fc": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaydynamodbadditionalrequesttemplatesRestApiidGET05129D15", @@ -83,9 +83,6 @@ "testapigatewaydynamodbadditionalrequesttemplatesRestApiDeploymentStageprod33ED5D23": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -106,6 +103,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" + }, "StageName": "prod", "TracingEnabled": true } @@ -128,14 +128,8 @@ "testapigatewaydynamodbadditionalrequesttemplatesRestApiidGET05129D15": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApiidA77CCE90" - }, - "RestApiId": { - "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -217,7 +211,13 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApiidA77CCE90" + }, + "RestApiId": { + "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" + } } }, "testapigatewaydynamodbadditionalrequesttemplatesRestApiUsagePlan905D10C7": { @@ -415,4 +415,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.additional-request-templates.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-additional-request-templates.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-CRUD.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-CRUD.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-CRUD.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-CRUD.expected.json index facc03a46..d14d2f2dd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-CRUD.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-CRUD.expected.json @@ -4,19 +4,19 @@ "testapigatewaydynamodbDynamoTableEEE3F463": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -60,10 +60,10 @@ "testapigatewaydynamodbRestApiDeployment1898674B00abb8cad507ed5309ac584f2dddf379": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaydynamodbRestApi80489300" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaydynamodbRestApiidDELETE6FC8A9F3", @@ -86,9 +86,6 @@ "testapigatewaydynamodbRestApiDeploymentStageprod2855C2C3": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaydynamodbRestApi80489300" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -109,6 +106,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaydynamodbRestApi80489300" + }, "StageName": "prod", "TracingEnabled": true } @@ -131,14 +131,8 @@ "testapigatewaydynamodbRestApiidGET6196F638": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "testapigatewaydynamodbRestApiid78018D34" - }, - "RestApiId": { - "Ref": "testapigatewaydynamodbRestApi80489300" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -208,20 +202,20 @@ }, "StatusCode": "500" } - ] - } - }, - "testapigatewaydynamodbRestApiidPUT1F965B23": { - "Type": "AWS::ApiGateway::Method", - "Properties": { - "HttpMethod": "PUT", + ], "ResourceId": { "Ref": "testapigatewaydynamodbRestApiid78018D34" }, "RestApiId": { "Ref": "testapigatewaydynamodbRestApi80489300" - }, + } + } + }, + "testapigatewaydynamodbRestApiidPUT1F965B23": { + "Type": "AWS::ApiGateway::Method", + "Properties": { "AuthorizationType": "AWS_IAM", + "HttpMethod": "PUT", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -291,20 +285,20 @@ }, "StatusCode": "500" } - ] - } - }, - "testapigatewaydynamodbRestApiidDELETE6FC8A9F3": { - "Type": "AWS::ApiGateway::Method", - "Properties": { - "HttpMethod": "DELETE", + ], "ResourceId": { "Ref": "testapigatewaydynamodbRestApiid78018D34" }, "RestApiId": { "Ref": "testapigatewaydynamodbRestApi80489300" - }, + } + } + }, + "testapigatewaydynamodbRestApiidDELETE6FC8A9F3": { + "Type": "AWS::ApiGateway::Method", + "Properties": { "AuthorizationType": "AWS_IAM", + "HttpMethod": "DELETE", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -374,23 +368,20 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Ref": "testapigatewaydynamodbRestApiid78018D34" + }, + "RestApiId": { + "Ref": "testapigatewaydynamodbRestApi80489300" + } } }, "testapigatewaydynamodbRestApiPOSTE99BD0BD": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Fn::GetAtt": [ - "testapigatewaydynamodbRestApi80489300", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testapigatewaydynamodbRestApi80489300" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -460,7 +451,16 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Fn::GetAtt": [ + "testapigatewaydynamodbRestApi80489300", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testapigatewaydynamodbRestApi80489300" + } } }, "testapigatewaydynamodbRestApiUsagePlan244F06C8": { @@ -688,4 +688,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-CRUD.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-CRUD.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-CRUD.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-CRUD.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-existing-table.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-existing-table.expected.json index 84ec8af74..8fb3beeae 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-existing-table.expected.json @@ -4,19 +4,19 @@ "existingtableE51CCC93": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "oddName", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "oddName", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -60,10 +60,10 @@ "testapigatewaydynamodbdefaultRestApiDeploymentFAC726F35a5f302579207081dccaeca1e34daf59": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaydynamodbdefaultRestApioddNameGET9FAAF1BB", @@ -83,9 +83,6 @@ "testapigatewaydynamodbdefaultRestApiDeploymentStageprod7834D304": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -106,6 +103,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" + }, "StageName": "prod", "TracingEnabled": true } @@ -128,14 +128,8 @@ "testapigatewaydynamodbdefaultRestApioddNameGET9FAAF1BB": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "testapigatewaydynamodbdefaultRestApioddName392BDAEE" - }, - "RestApiId": { - "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -205,7 +199,13 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Ref": "testapigatewaydynamodbdefaultRestApioddName392BDAEE" + }, + "RestApiId": { + "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" + } } }, "testapigatewaydynamodbdefaultRestApiUsagePlanA266BB3D": { @@ -403,4 +403,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-existing-table.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-existing-table.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.custom-integration-responses.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-custom-integration-responses.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.custom-integration-responses.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-custom-integration-responses.expected.json index e67df73de..28443ecb8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.custom-integration-responses.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-custom-integration-responses.expected.json @@ -4,19 +4,19 @@ "existingtableE51CCC93": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -60,10 +60,10 @@ "testapigatewaydynamodbadditionalrequesttemplatesRestApiDeployment0AE7C47761b8949a9247c12493c939f05e630c9d": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaydynamodbadditionalrequesttemplatesRestApiidGET05129D15", @@ -83,9 +83,6 @@ "testapigatewaydynamodbadditionalrequesttemplatesRestApiDeploymentStageprod33ED5D23": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -106,6 +103,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" + }, "StageName": "prod", "TracingEnabled": true } @@ -128,14 +128,8 @@ "testapigatewaydynamodbadditionalrequesttemplatesRestApiidGET05129D15": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApiidA77CCE90" - }, - "RestApiId": { - "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -205,7 +199,13 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApiidA77CCE90" + }, + "RestApiId": { + "Ref": "testapigatewaydynamodbadditionalrequesttemplatesRestApi03F6484C" + } } }, "testapigatewaydynamodbadditionalrequesttemplatesRestApiUsagePlan905D10C7": { @@ -403,4 +403,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.custom-integration-responses.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-custom-integration-responses.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.custom-integration-responses.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-custom-integration-responses.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-no-arguments.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-no-arguments.expected.json index 5c02ac352..afff932ba 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-no-arguments.expected.json @@ -4,19 +4,19 @@ "testapigatewaydynamodbdefaultDynamoTable0720D92C": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -60,10 +60,10 @@ "testapigatewaydynamodbdefaultRestApiDeploymentFAC726F3818e0ad130f9a49152a4afbd35ada7b6": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaydynamodbdefaultRestApiidGET94B6F433", @@ -83,9 +83,6 @@ "testapigatewaydynamodbdefaultRestApiDeploymentStageprod7834D304": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -106,6 +103,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" + }, "StageName": "prod", "TracingEnabled": true } @@ -128,14 +128,8 @@ "testapigatewaydynamodbdefaultRestApiidGET94B6F433": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "testapigatewaydynamodbdefaultRestApiidFD6A9E91" - }, - "RestApiId": { - "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -205,7 +199,13 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Ref": "testapigatewaydynamodbdefaultRestApiidFD6A9E91" + }, + "RestApiId": { + "Ref": "testapigatewaydynamodbdefaultRestApi9102FDF9" + } } }, "testapigatewaydynamodbdefaultRestApiUsagePlanA266BB3D": { @@ -403,4 +403,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-defaultParams.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-defaultParams.expected.json index cb176c354..9ead7c37b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-defaultParams.expected.json @@ -113,10 +113,10 @@ "testapigatewayiotRestApiDeploymentA8FCF5057ffc77ee6fd9f35b0f1c353f67d36988": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewayiotRestApi0EC16DD2" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewayiotawsapigatewayiotreqval2BA7D930", @@ -155,9 +155,6 @@ "testapigatewayiotRestApiDeploymentStageprod25838482": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -178,6 +175,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" + }, "StageName": "prod", "TracingEnabled": true } @@ -212,14 +212,8 @@ "testapigatewayiotRestApimessagetopiclevel1POST4E6A3C44": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1CB1305F5" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -292,6 +286,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1CB1305F5" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } } }, @@ -310,14 +310,8 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2POST09BB4430": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel25B0B16A2" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -392,6 +386,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel25B0B16A2" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } } }, @@ -410,14 +410,8 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3POST0B6A3876": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel35F49E3DD" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -494,6 +488,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel35F49E3DD" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } } }, @@ -512,14 +512,8 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4POST93CAD241": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4C5A3338B" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -598,6 +592,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4C5A3338B" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } } }, @@ -616,14 +616,8 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5POST2D2539FA": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5497EB56B" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -704,6 +698,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5497EB56B" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } } }, @@ -722,14 +722,8 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6POST806C543B": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel69F2FBFA8" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -812,6 +806,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel69F2FBFA8" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } } }, @@ -830,14 +830,8 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6topiclevel7POSTAF784AE7": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6topiclevel78397BAEF" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -922,6 +916,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6topiclevel78397BAEF" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } } }, @@ -955,14 +955,8 @@ "testapigatewayiotRestApishadowthingNamePOSTD37686D4": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApishadowthingName3837242E" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -1035,6 +1029,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApishadowthingName3837242E" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } } }, @@ -1053,14 +1053,8 @@ "testapigatewayiotRestApishadowthingNameshadowNamePOST260BE793": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApishadowthingNameshadowName04D15774" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -1135,6 +1129,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApishadowthingNameshadowName04D15774" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } } }, @@ -1300,4 +1300,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-defaultParams.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-defaultParams.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-overrideParams.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-overrideParams.expected.json index 1133dd641..363238a62 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-overrideParams.expected.json @@ -107,10 +107,10 @@ "testapigatewayiotRestApiDeploymentA8FCF5050f1987d2a995276f2146de670d9fa976": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Description for the Regional Rest Api", "RestApiId": { "Ref": "testapigatewayiotRestApi0EC16DD2" - }, - "Description": "Description for the Regional Rest Api" + } }, "DependsOn": [ "testapigatewayiotawsapigatewayiotreqval2BA7D930", @@ -149,9 +149,6 @@ "testapigatewayiotRestApiDeploymentStageprod25838482": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -172,6 +169,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" + }, "StageName": "prod", "TracingEnabled": true } @@ -206,15 +206,9 @@ "testapigatewayiotRestApimessagetopiclevel1POST4E6A3C44": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1CB1305F5" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -287,6 +281,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1CB1305F5" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -315,15 +315,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2POST09BB4430": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel25B0B16A2" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -398,6 +392,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel25B0B16A2" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -426,15 +426,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3POST0B6A3876": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel35F49E3DD" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -511,6 +505,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel35F49E3DD" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -539,15 +539,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4POST93CAD241": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4C5A3338B" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -626,6 +620,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4C5A3338B" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -654,15 +654,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5POST2D2539FA": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5497EB56B" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -743,6 +737,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5497EB56B" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -771,15 +771,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6POST806C543B": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel69F2FBFA8" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -862,6 +856,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel69F2FBFA8" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -890,15 +890,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6topiclevel7POSTAF784AE7": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6topiclevel78397BAEF" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -983,6 +977,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6topiclevel78397BAEF" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -1026,15 +1026,9 @@ "testapigatewayiotRestApishadowthingNamePOSTD37686D4": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApishadowthingName3837242E" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -1107,6 +1101,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApishadowthingName3837242E" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -1135,15 +1135,9 @@ "testapigatewayiotRestApishadowthingNameshadowNamePOST260BE793": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApishadowthingNameshadowName04D15774" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -1218,6 +1212,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApishadowthingNameshadowName04D15774" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -1247,7 +1247,7 @@ ] } }, - "testapigatewayiotRestApiUsagePlanUsagePlanKeyResourceoverrideParamstestapigatewayiotRestApiApiKey9DF117C022AD8BF0": { + "testapigatewayiotRestApiUsagePlanUsagePlanKeyResourceapiiotoverrideParamstestapigatewayiotRestApiApiKeyA957893EA334C391": { "Type": "AWS::ApiGateway::UsagePlanKey", "Properties": { "KeyId": { @@ -1421,4 +1421,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-overrideParams.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-overrideParams.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-override_auth_api_keys.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-override_auth_api_keys.expected.json index 1a2184a10..93591e26e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-override_auth_api_keys.expected.json @@ -113,10 +113,10 @@ "testapigatewayiotRestApiDeploymentA8FCF50585c5ccbacf1bb79394cb3eea4f66a01a": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewayiotRestApi0EC16DD2" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewayiotawsapigatewayiotreqval2BA7D930", @@ -155,9 +155,6 @@ "testapigatewayiotRestApiDeploymentStageprod25838482": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -178,6 +175,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" + }, "StageName": "prod", "TracingEnabled": true } @@ -212,15 +212,9 @@ "testapigatewayiotRestApimessagetopiclevel1POST4E6A3C44": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1CB1305F5" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -293,6 +287,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1CB1305F5" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -321,15 +321,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2POST09BB4430": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel25B0B16A2" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -404,6 +398,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel25B0B16A2" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -432,15 +432,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3POST0B6A3876": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel35F49E3DD" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -517,6 +511,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel35F49E3DD" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -545,15 +545,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4POST93CAD241": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4C5A3338B" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -632,6 +626,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4C5A3338B" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -660,15 +660,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5POST2D2539FA": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5497EB56B" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -749,6 +743,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5497EB56B" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -777,15 +777,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6POST806C543B": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel69F2FBFA8" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -868,6 +862,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel69F2FBFA8" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -896,15 +896,9 @@ "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6topiclevel7POSTAF784AE7": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6topiclevel78397BAEF" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -989,6 +983,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApimessagetopiclevel1topiclevel2topiclevel3topiclevel4topiclevel5topiclevel6topiclevel78397BAEF" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -1032,15 +1032,9 @@ "testapigatewayiotRestApishadowthingNamePOSTD37686D4": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApishadowthingName3837242E" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -1113,6 +1107,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApishadowthingName3837242E" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -1141,15 +1141,9 @@ "testapigatewayiotRestApishadowthingNameshadowNamePOST260BE793": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewayiotRestApishadowthingNameshadowName04D15774" - }, - "RestApiId": { - "Ref": "testapigatewayiotRestApi0EC16DD2" - }, "ApiKeyRequired": true, "AuthorizationType": "NONE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -1224,6 +1218,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewayiotawsapigatewayiotreqval2BA7D930" + }, + "ResourceId": { + "Ref": "testapigatewayiotRestApishadowthingNameshadowName04D15774" + }, + "RestApiId": { + "Ref": "testapigatewayiotRestApi0EC16DD2" } }, "Metadata": { @@ -1253,7 +1253,7 @@ ] } }, - "testapigatewayiotRestApiUsagePlanUsagePlanKeyResourceoverrideauthapikeystestapigatewayiotRestApiApiKey393D3E36B43FA58D": { + "testapigatewayiotRestApiUsagePlanUsagePlanKeyResourceapiiotoverrideauthapikeystestapigatewayiotRestApiApiKey08654B853EA9B936": { "Type": "AWS::ApiGateway::UsagePlanKey", "Properties": { "KeyId": { @@ -1427,4 +1427,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-override_auth_api_keys.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-override_auth_api_keys.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-additional-request-templates.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-additional-request-templates.expected.json index 8108502ac..8e14c257f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-additional-request-templates.expected.json @@ -34,10 +34,10 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApiDeployment5A447E3D3f205cdf3c053c5a1187e7b2a0f3474d": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaykinesisadditionalrequesttemplatesRestApirecordPOST307FC87D", @@ -62,9 +62,6 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApiDeploymentStageprodD274025B": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -85,6 +82,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" + }, "StageName": "prod", "TracingEnabled": true } @@ -107,14 +107,8 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApirecordPOST307FC87D": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirecord01520200" - }, - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -204,6 +198,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirequestvalidator69E589CE" + }, + "ResourceId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirecord01520200" + }, + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" } } }, @@ -225,14 +225,8 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApirecordsPOST5F6260A2": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirecords37B412D1" - }, - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -310,6 +304,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirequestvalidator69E589CE" + }, + "ResourceId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirecords37B412D1" + }, + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" } } }, @@ -332,22 +332,22 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApirequestvalidator69E589CE": { "Type": "AWS::ApiGateway::RequestValidator", "Properties": { + "Name": "request-body-validator", "RestApiId": { "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" }, - "Name": "request-body-validator", "ValidateRequestBody": true } }, "testapigatewaykinesisadditionalrequesttemplatesRestApiPutRecordModel1A75CC15": { "Type": "AWS::ApiGateway::Model", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "ContentType": "application/json", "Description": "PutRecord proxy single-record payload", "Name": "PutRecordModel", + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" + }, "Schema": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PutRecord proxy single-record payload", @@ -370,12 +370,12 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApiPutRecordsModel49E0CAB9": { "Type": "AWS::ApiGateway::Model", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "ContentType": "application/json", "Description": "PutRecords proxy payload data", "Name": "PutRecordsModel", + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" + }, "Schema": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PutRecords proxy payload data", @@ -529,9 +529,9 @@ "testapigatewaykinesisadditionalrequesttemplatesKinesisStreamGetRecordsIteratorAgeAlarm05247CB0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -542,9 +542,9 @@ "testapigatewaykinesisadditionalrequesttemplatesKinesisStreamReadProvisionedThroughputExceededAlarmE49197EC": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -626,4 +626,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-additional-request-templates.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.additional-request-templates.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-additional-request-templates.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-apigateway-kinesis-overwrite.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-apigateway-kinesis-overwrite.expected.json index 5de730a4e..9b944aeea 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-apigateway-kinesis-overwrite.expected.json @@ -34,10 +34,10 @@ "testapigatewaykinesisoverwriteRestApiDeployment1EE3B096ca960d6e964dacd9ef8ada66856cca97": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaykinesisoverwriteRestApirecordPOST2B249308", @@ -62,9 +62,6 @@ "testapigatewaykinesisoverwriteRestApiDeploymentStageprodA3A23FDE": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -92,6 +89,9 @@ "ThrottlingRateLimit": 100 } ], + "RestApiId": { + "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" + }, "StageName": "prod", "TracingEnabled": true } @@ -114,14 +114,8 @@ "testapigatewaykinesisoverwriteRestApirecordPOST2B249308": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewaykinesisoverwriteRestApirecordAECF6BBC" - }, - "RestApiId": { - "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -199,6 +193,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewaykinesisoverwriteRestApirequestvalidatorBAD987F2" + }, + "ResourceId": { + "Ref": "testapigatewaykinesisoverwriteRestApirecordAECF6BBC" + }, + "RestApiId": { + "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" } } }, @@ -220,14 +220,8 @@ "testapigatewaykinesisoverwriteRestApirecordsPOST1501AC33": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewaykinesisoverwriteRestApirecordsB70B7E7F" - }, - "RestApiId": { - "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -305,6 +299,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewaykinesisoverwriteRestApirequestvalidatorBAD987F2" + }, + "ResourceId": { + "Ref": "testapigatewaykinesisoverwriteRestApirecordsB70B7E7F" + }, + "RestApiId": { + "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" } } }, @@ -327,20 +327,20 @@ "testapigatewaykinesisoverwriteRestApirequestvalidatorBAD987F2": { "Type": "AWS::ApiGateway::RequestValidator", "Properties": { + "Name": "request-body-validator", "RestApiId": { "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" }, - "Name": "request-body-validator", "ValidateRequestBody": true } }, "testapigatewaykinesisoverwriteRestApiPutRecordModel82F936E0": { "Type": "AWS::ApiGateway::Model", "Properties": { + "ContentType": "application/json", "RestApiId": { "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" }, - "ContentType": "application/json", "Schema": { "$schema": "http://json-schema.org/draft-04/schema#" } @@ -349,10 +349,10 @@ "testapigatewaykinesisoverwriteRestApiPutRecordsModel120A48A8": { "Type": "AWS::ApiGateway::Model", "Properties": { + "ContentType": "application/json", "RestApiId": { "Ref": "testapigatewaykinesisoverwriteRestApi77ABE5DA" }, - "ContentType": "application/json", "Schema": { "$schema": "http://json-schema.org/draft-04/schema#" } @@ -481,9 +481,9 @@ "testapigatewaykinesisoverwriteKinesisStreamGetRecordsIteratorAgeAlarmAF0BEF52": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -494,9 +494,9 @@ "testapigatewaykinesisoverwriteKinesisStreamReadProvisionedThroughputExceededAlarm5C0040FB": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -578,4 +578,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-apigateway-kinesis-overwrite.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apigateway-kinesis-overwrite.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-apigateway-kinesis-overwrite.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-custom-integration-responses.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-custom-integration-responses.expected.json index bbdf26eb8..87be3b186 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-custom-integration-responses.expected.json @@ -34,10 +34,10 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApiDeployment5A447E3D68efb2650de4064374902887dee80c33": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaykinesisadditionalrequesttemplatesRestApirecordPOST307FC87D", @@ -62,9 +62,6 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApiDeploymentStageprodD274025B": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -85,6 +82,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" + }, "StageName": "prod", "TracingEnabled": true } @@ -107,14 +107,8 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApirecordPOST307FC87D": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirecord01520200" - }, - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -188,6 +182,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirequestvalidator69E589CE" + }, + "ResourceId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirecord01520200" + }, + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" } } }, @@ -209,14 +209,8 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApirecordsPOST5F6260A2": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirecords37B412D1" - }, - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -294,6 +288,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirequestvalidator69E589CE" + }, + "ResourceId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApirecords37B412D1" + }, + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" } } }, @@ -316,22 +316,22 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApirequestvalidator69E589CE": { "Type": "AWS::ApiGateway::RequestValidator", "Properties": { + "Name": "request-body-validator", "RestApiId": { "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" }, - "Name": "request-body-validator", "ValidateRequestBody": true } }, "testapigatewaykinesisadditionalrequesttemplatesRestApiPutRecordModel1A75CC15": { "Type": "AWS::ApiGateway::Model", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "ContentType": "application/json", "Description": "PutRecord proxy single-record payload", "Name": "PutRecordModel", + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" + }, "Schema": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PutRecord proxy single-record payload", @@ -354,12 +354,12 @@ "testapigatewaykinesisadditionalrequesttemplatesRestApiPutRecordsModel49E0CAB9": { "Type": "AWS::ApiGateway::Model", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" - }, "ContentType": "application/json", "Description": "PutRecords proxy payload data", "Name": "PutRecordsModel", + "RestApiId": { + "Ref": "testapigatewaykinesisadditionalrequesttemplatesRestApiCCD096E7" + }, "Schema": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PutRecords proxy payload data", @@ -513,9 +513,9 @@ "testapigatewaykinesisadditionalrequesttemplatesKinesisStreamGetRecordsIteratorAgeAlarm05247CB0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -526,9 +526,9 @@ "testapigatewaykinesisadditionalrequesttemplatesKinesisStreamReadProvisionedThroughputExceededAlarmE49197EC": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -610,4 +610,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-custom-integration-responses.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.custom-integration-responses.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-custom-integration-responses.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-no-arguments.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-no-arguments.expected.json index 7037d7e4f..4e6df2a10 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-no-arguments.expected.json @@ -34,10 +34,10 @@ "testapigatewaykinesisdefaultRestApiDeployment2852F1AA922824384d19fd27217710115cc2344f": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaykinesisdefaultRestApirecordPOST731165E8", @@ -62,9 +62,6 @@ "testapigatewaykinesisdefaultRestApiDeploymentStageprodB6206494": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -85,6 +82,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" + }, "StageName": "prod", "TracingEnabled": true } @@ -107,14 +107,8 @@ "testapigatewaykinesisdefaultRestApirecordPOST731165E8": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewaykinesisdefaultRestApirecord500DDD57" - }, - "RestApiId": { - "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -192,6 +186,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewaykinesisdefaultRestApirequestvalidator5901C267" + }, + "ResourceId": { + "Ref": "testapigatewaykinesisdefaultRestApirecord500DDD57" + }, + "RestApiId": { + "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" } } }, @@ -213,14 +213,8 @@ "testapigatewaykinesisdefaultRestApirecordsPOST165BE933": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Ref": "testapigatewaykinesisdefaultRestApirecords972EAFEA" - }, - "RestApiId": { - "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -298,6 +292,12 @@ }, "RequestValidatorId": { "Ref": "testapigatewaykinesisdefaultRestApirequestvalidator5901C267" + }, + "ResourceId": { + "Ref": "testapigatewaykinesisdefaultRestApirecords972EAFEA" + }, + "RestApiId": { + "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" } } }, @@ -320,22 +320,22 @@ "testapigatewaykinesisdefaultRestApirequestvalidator5901C267": { "Type": "AWS::ApiGateway::RequestValidator", "Properties": { + "Name": "request-body-validator", "RestApiId": { "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" }, - "Name": "request-body-validator", "ValidateRequestBody": true } }, "testapigatewaykinesisdefaultRestApiPutRecordModel06DC611F": { "Type": "AWS::ApiGateway::Model", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" - }, "ContentType": "application/json", "Description": "PutRecord proxy single-record payload", "Name": "PutRecordModel", + "RestApiId": { + "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" + }, "Schema": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PutRecord proxy single-record payload", @@ -358,12 +358,12 @@ "testapigatewaykinesisdefaultRestApiPutRecordsModelA7CA8D6D": { "Type": "AWS::ApiGateway::Model", "Properties": { - "RestApiId": { - "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" - }, "ContentType": "application/json", "Description": "PutRecords proxy payload data", "Name": "PutRecordsModel", + "RestApiId": { + "Ref": "testapigatewaykinesisdefaultRestApi68CBA18C" + }, "Schema": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PutRecords proxy payload data", @@ -517,9 +517,9 @@ "testapigatewaykinesisdefaultKinesisStreamGetRecordsIteratorAgeAlarm0638BB32": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -530,9 +530,9 @@ "testapigatewaykinesisdefaultKinesisStreamReadProvisionedThroughputExceededAlarmE7251F6A": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, @@ -614,4 +614,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-kinesisstreams/test/integ.apikin-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-deployFunction.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-deployFunction.expected.json index e154b7aa8..60277b77d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-deployFunction.expected.json @@ -99,18 +99,18 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "testapigatewaylambdaLambdaFunctionServiceRole5CD2E9F7", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testapigatewaylambdaLambdaFunctionServiceRole5CD2E9F7", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -172,10 +172,10 @@ "testapigatewaylambdaLambdaRestApiDeployment85334BB3a1765c45928980e423727978265730d1": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaylambdaLambdaRestApiE957E944" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaylambdaLambdaRestApiproxyANYF6150927", @@ -196,9 +196,6 @@ "testapigatewaylambdaLambdaRestApiDeploymentStageprod4EBF7247": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaylambdaLambdaRestApiE957E944" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -219,6 +216,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaylambdaLambdaRestApiE957E944" + }, "StageName": "prod", "TracingEnabled": true } @@ -238,7 +238,7 @@ } } }, - "testapigatewaylambdaLambdaRestApiproxyANYApiPermissiondeployFunctiontestapigatewaylambdaLambdaRestApiDFF7E210ANYproxy84284392": { + "testapigatewaylambdaLambdaRestApiproxyANYApiPermissionapilamdeployFunctiontestapigatewaylambdaLambdaRestApiAF929C5FANYproxy83DC1CFF": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -279,7 +279,7 @@ } } }, - "testapigatewaylambdaLambdaRestApiproxyANYApiPermissionTestdeployFunctiontestapigatewaylambdaLambdaRestApiDFF7E210ANYproxy52515209": { + "testapigatewaylambdaLambdaRestApiproxyANYApiPermissionTestapilamdeployFunctiontestapigatewaylambdaLambdaRestApiAF929C5FANYproxy46D6E92A": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -319,14 +319,8 @@ "testapigatewaylambdaLambdaRestApiproxyANYF6150927": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "testapigatewaylambdaLambdaRestApiproxy2C2C544E" - }, - "RestApiId": { - "Ref": "testapigatewaylambdaLambdaRestApiE957E944" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -353,10 +347,16 @@ ] ] } + }, + "ResourceId": { + "Ref": "testapigatewaylambdaLambdaRestApiproxy2C2C544E" + }, + "RestApiId": { + "Ref": "testapigatewaylambdaLambdaRestApiE957E944" } } }, - "testapigatewaylambdaLambdaRestApiANYApiPermissiondeployFunctiontestapigatewaylambdaLambdaRestApiDFF7E210ANY037EAB10": { + "testapigatewaylambdaLambdaRestApiANYApiPermissionapilamdeployFunctiontestapigatewaylambdaLambdaRestApiAF929C5FANY15383DB1": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -397,7 +397,7 @@ } } }, - "testapigatewaylambdaLambdaRestApiANYApiPermissionTestdeployFunctiontestapigatewaylambdaLambdaRestApiDFF7E210ANY7E2E56FC": { + "testapigatewaylambdaLambdaRestApiANYApiPermissionTestapilamdeployFunctiontestapigatewaylambdaLambdaRestApiAF929C5FANYC3A64F38": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -437,17 +437,8 @@ "testapigatewaylambdaLambdaRestApiANY1FACA749": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "testapigatewaylambdaLambdaRestApiE957E944", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testapigatewaylambdaLambdaRestApiE957E944" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -474,6 +465,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "testapigatewaylambdaLambdaRestApiE957E944", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testapigatewaylambdaLambdaRestApiE957E944" } } }, @@ -629,4 +629,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-deployFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-deployFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-existingFunction.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-existingFunction.expected.json index 500d0accd..4b5bd8abf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-existingFunction.expected.json @@ -99,18 +99,18 @@ }, "S3Key": "0904d3723480fed2daf7885caa427b930881caae6879d1e6b0d395020173ef6f.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -172,10 +172,10 @@ "testapigatewaylambdaLambdaRestApiDeployment85334BB3938813331492485ced06ab87062fb015": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaylambdaLambdaRestApiE957E944" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaylambdaLambdaRestApiproxyANYF6150927", @@ -196,9 +196,6 @@ "testapigatewaylambdaLambdaRestApiDeploymentStageprod4EBF7247": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaylambdaLambdaRestApiE957E944" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -219,6 +216,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaylambdaLambdaRestApiE957E944" + }, "StageName": "prod", "TracingEnabled": true } @@ -238,7 +238,7 @@ } } }, - "testapigatewaylambdaLambdaRestApiproxyANYApiPermissionexistingFunctiontestapigatewaylambdaLambdaRestApi67C22A4BANYproxy0CD9F739": { + "testapigatewaylambdaLambdaRestApiproxyANYApiPermissionapilamexistingFunctiontestapigatewaylambdaLambdaRestApiEC1EB7CDANYproxy184097FE": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -279,7 +279,7 @@ } } }, - "testapigatewaylambdaLambdaRestApiproxyANYApiPermissionTestexistingFunctiontestapigatewaylambdaLambdaRestApi67C22A4BANYproxy3558317D": { + "testapigatewaylambdaLambdaRestApiproxyANYApiPermissionTestapilamexistingFunctiontestapigatewaylambdaLambdaRestApiEC1EB7CDANYproxy0716AB43": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -319,14 +319,8 @@ "testapigatewaylambdaLambdaRestApiproxyANYF6150927": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "testapigatewaylambdaLambdaRestApiproxy2C2C544E" - }, - "RestApiId": { - "Ref": "testapigatewaylambdaLambdaRestApiE957E944" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -353,10 +347,16 @@ ] ] } + }, + "ResourceId": { + "Ref": "testapigatewaylambdaLambdaRestApiproxy2C2C544E" + }, + "RestApiId": { + "Ref": "testapigatewaylambdaLambdaRestApiE957E944" } } }, - "testapigatewaylambdaLambdaRestApiANYApiPermissionexistingFunctiontestapigatewaylambdaLambdaRestApi67C22A4BANY45EBFD09": { + "testapigatewaylambdaLambdaRestApiANYApiPermissionapilamexistingFunctiontestapigatewaylambdaLambdaRestApiEC1EB7CDANY245ECD8E": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -397,7 +397,7 @@ } } }, - "testapigatewaylambdaLambdaRestApiANYApiPermissionTestexistingFunctiontestapigatewaylambdaLambdaRestApi67C22A4BANY7AEAC00D": { + "testapigatewaylambdaLambdaRestApiANYApiPermissionTestapilamexistingFunctiontestapigatewaylambdaLambdaRestApiEC1EB7CDANYCE9E6EFA": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -437,17 +437,8 @@ "testapigatewaylambdaLambdaRestApiANY1FACA749": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "testapigatewaylambdaLambdaRestApiE957E944", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testapigatewaylambdaLambdaRestApiE957E944" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -474,6 +465,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "testapigatewaylambdaLambdaRestApiE957E944", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testapigatewaylambdaLambdaRestApiE957E944" } } }, @@ -629,4 +629,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-existingFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-existingFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-additional-request-templates.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.additional-request-templates.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-additional-request-templates.expected.json index a56e9da6a..0fa8fb57b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-additional-request-templates.expected.json @@ -34,10 +34,10 @@ "testapigatewaysagemakerendpointdefaultRestApiDeployment04BFEB63ab5dc870083af2a47a41af0f4ee69fff": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaysagemakerendpointdefaultRestApiuseridGETB3BB79AA", @@ -58,9 +58,6 @@ "testapigatewaysagemakerendpointdefaultRestApiDeploymentStageprodFD1743A7": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -81,6 +78,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + }, "StageName": "prod", "TracingEnabled": true } @@ -103,14 +103,8 @@ "testapigatewaysagemakerendpointdefaultRestApiuseridGETB3BB79AA": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "testapigatewaysagemakerendpointdefaultRestApiuserid9952BA11" - }, - "RestApiId": { - "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -171,6 +165,12 @@ ], "RequestValidatorId": { "Ref": "testapigatewaysagemakerendpointdefaultRestApirequestvalidator1A23C251" + }, + "ResourceId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApiuserid9952BA11" + }, + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" } } }, @@ -193,10 +193,10 @@ "testapigatewaysagemakerendpointdefaultRestApirequestvalidator1A23C251": { "Type": "AWS::ApiGateway::RequestValidator", "Properties": { + "Name": "request-param-validator", "RestApiId": { "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" }, - "Name": "request-param-validator", "ValidateRequestParameters": true } }, @@ -393,4 +393,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.additional-request-templates.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-additional-request-templates.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.additional-request-templates.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-additional-request-templates.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-apigateway-sagemakerendpoint-overwrite.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-apigateway-sagemakerendpoint-overwrite.expected.json index f42bbea54..51fc55c7c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-apigateway-sagemakerendpoint-overwrite.expected.json @@ -86,10 +86,10 @@ "testapigatewaysagemakerendpointoverwriteRestApiDeployment3B3B03364a19f99c87430d39385b3313a65df211": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaysagemakerendpointoverwriteRestApipredictedratingsuseridGET06B35696", @@ -111,9 +111,6 @@ "testapigatewaysagemakerendpointoverwriteRestApiDeploymentStageprod39A2035F": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -134,6 +131,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" + }, "StageName": "prod", "TracingEnabled": true } @@ -168,14 +168,8 @@ "testapigatewaysagemakerendpointoverwriteRestApipredictedratingsuseridGET06B35696": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "testapigatewaysagemakerendpointoverwriteRestApipredictedratingsuseridB999A556" - }, - "RestApiId": { - "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -238,6 +232,12 @@ ], "RequestValidatorId": { "Ref": "testapigatewaysagemakerendpointoverwriteRestApirequestvalidatorFA90CC69" + }, + "ResourceId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApipredictedratingsuseridB999A556" + }, + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" } } }, @@ -260,10 +260,10 @@ "testapigatewaysagemakerendpointoverwriteRestApirequestvalidatorFA90CC69": { "Type": "AWS::ApiGateway::RequestValidator", "Properties": { + "Name": "request-param-validator", "RestApiId": { "Ref": "testapigatewaysagemakerendpointoverwriteRestApi0EE22754" }, - "Name": "request-param-validator", "ValidateRequestParameters": true } }, @@ -403,4 +403,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-apigateway-sagemakerendpoint-overwrite.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apigateway-sagemakerendpoint-overwrite.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-apigateway-sagemakerendpoint-overwrite.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-no-overwrite.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-no-overwrite.expected.json index 7ab66b90f..fb77cc90d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-no-overwrite.expected.json @@ -34,10 +34,10 @@ "testapigatewaysagemakerendpointdefaultRestApiDeployment04BFEB63b4264c277dbe6aa60ff584ba21d5d060": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaysagemakerendpointdefaultRestApiuseridGETB3BB79AA", @@ -58,9 +58,6 @@ "testapigatewaysagemakerendpointdefaultRestApiDeploymentStageprodFD1743A7": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -81,6 +78,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" + }, "StageName": "prod", "TracingEnabled": true } @@ -103,14 +103,8 @@ "testapigatewaysagemakerendpointdefaultRestApiuseridGETB3BB79AA": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "testapigatewaysagemakerendpointdefaultRestApiuserid9952BA11" - }, - "RestApiId": { - "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -170,6 +164,12 @@ ], "RequestValidatorId": { "Ref": "testapigatewaysagemakerendpointdefaultRestApirequestvalidator1A23C251" + }, + "ResourceId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApiuserid9952BA11" + }, + "RestApiId": { + "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" } } }, @@ -192,10 +192,10 @@ "testapigatewaysagemakerendpointdefaultRestApirequestvalidator1A23C251": { "Type": "AWS::ApiGateway::RequestValidator", "Properties": { + "Name": "request-param-validator", "RestApiId": { "Ref": "testapigatewaysagemakerendpointdefaultRestApi7D1DA11B" }, - "Name": "request-param-validator", "ValidateRequestParameters": true } }, @@ -392,4 +392,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-no-overwrite.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.no-overwrite.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sagemakerendpoint/test/integ.apisag-no-overwrite.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-additional-request-templates.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.additional-request-templates.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-additional-request-templates.expected.json index f50cec09a..f871d7bf2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-additional-request-templates.expected.json @@ -201,10 +201,10 @@ "testapigatewaysqsdefaultRestApiDeploymentFB9688F5aa398c65c945d66dd485b50d59cc7a25": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaysqsdefaultRestApi554243C3" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaysqsdefaultRestApiGET733E6394", @@ -225,9 +225,6 @@ "testapigatewaysqsdefaultRestApiDeploymentStageprod600FEEE2": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaysqsdefaultRestApi554243C3" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -248,6 +245,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaysqsdefaultRestApi554243C3" + }, "StageName": "prod", "TracingEnabled": true } @@ -270,17 +270,8 @@ "testapigatewaysqsdefaultRestApiPOSTD8ACD1CB": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Fn::GetAtt": [ - "testapigatewaysqsdefaultRestApi554243C3", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testapigatewaysqsdefaultRestApi554243C3" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -350,13 +341,7 @@ }, "StatusCode": "500" } - ] - } - }, - "testapigatewaysqsdefaultRestApiGET733E6394": { - "Type": "AWS::ApiGateway::Method", - "Properties": { - "HttpMethod": "GET", + ], "ResourceId": { "Fn::GetAtt": [ "testapigatewaysqsdefaultRestApi554243C3", @@ -365,8 +350,14 @@ }, "RestApiId": { "Ref": "testapigatewaysqsdefaultRestApi554243C3" - }, + } + } + }, + "testapigatewaysqsdefaultRestApiGET733E6394": { + "Type": "AWS::ApiGateway::Method", + "Properties": { "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -435,7 +426,16 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Fn::GetAtt": [ + "testapigatewaysqsdefaultRestApi554243C3", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testapigatewaysqsdefaultRestApi554243C3" + } } }, "testapigatewaysqsdefaultRestApiUsagePlan3475CA67": { @@ -643,4 +643,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.additional-request-templates.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-additional-request-templates.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.additional-request-templates.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-additional-request-templates.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.expected.json index 752ae8ec5..1b5fd0c33 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.expected.json @@ -201,10 +201,10 @@ "testapigatewaysqsRestApiDeploymentCA19D3723284170350125cf6cf25e30c33a57efd": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaysqsRestApi557C7EDC" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaysqsRestApiGET4AA265C9", @@ -226,9 +226,6 @@ "testapigatewaysqsRestApiDeploymentStageprod1C007159": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaysqsRestApi557C7EDC" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -249,6 +246,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaysqsRestApi557C7EDC" + }, "StageName": "prod", "TracingEnabled": true } @@ -271,14 +271,8 @@ "testapigatewaysqsRestApimessageDELETE2D4539B7": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "DELETE", - "ResourceId": { - "Ref": "testapigatewaysqsRestApimessage6D62B7B0" - }, - "RestApiId": { - "Ref": "testapigatewaysqsRestApi557C7EDC" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "DELETE", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -347,23 +341,20 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Ref": "testapigatewaysqsRestApimessage6D62B7B0" + }, + "RestApiId": { + "Ref": "testapigatewaysqsRestApi557C7EDC" + } } }, "testapigatewaysqsRestApiPOST26D15DBA": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "POST", - "ResourceId": { - "Fn::GetAtt": [ - "testapigatewaysqsRestApi557C7EDC", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testapigatewaysqsRestApi557C7EDC" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -432,13 +423,7 @@ }, "StatusCode": "500" } - ] - } - }, - "testapigatewaysqsRestApiGET4AA265C9": { - "Type": "AWS::ApiGateway::Method", - "Properties": { - "HttpMethod": "GET", + ], "ResourceId": { "Fn::GetAtt": [ "testapigatewaysqsRestApi557C7EDC", @@ -447,8 +432,14 @@ }, "RestApiId": { "Ref": "testapigatewaysqsRestApi557C7EDC" - }, + } + } + }, + "testapigatewaysqsRestApiGET4AA265C9": { + "Type": "AWS::ApiGateway::Method", + "Properties": { "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -517,7 +508,16 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Fn::GetAtt": [ + "testapigatewaysqsRestApi557C7EDC", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testapigatewaysqsRestApi557C7EDC" + } } }, "testapigatewaysqsRestApiUsagePlan2295EB95": { @@ -735,4 +735,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.custom-integration-responses.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-custom-integration-responses.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.custom-integration-responses.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-custom-integration-responses.expected.json index 746f632fa..10ff3fd83 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.custom-integration-responses.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-custom-integration-responses.expected.json @@ -201,10 +201,10 @@ "testapigatewaysqsintegrationresponsesRestApiDeployment9749223507b4327bc896117bc13d1c395d6fa5e7": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaysqsintegrationresponsesRestApi3BE7E402" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaysqsintegrationresponsesRestApiGETD105D1F1", @@ -224,9 +224,6 @@ "testapigatewaysqsintegrationresponsesRestApiDeploymentStageprod07200D02": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaysqsintegrationresponsesRestApi3BE7E402" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -247,6 +244,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaysqsintegrationresponsesRestApi3BE7E402" + }, "StageName": "prod", "TracingEnabled": true } @@ -269,17 +269,8 @@ "testapigatewaysqsintegrationresponsesRestApiGETD105D1F1": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Fn::GetAtt": [ - "testapigatewaysqsintegrationresponsesRestApi3BE7E402", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testapigatewaysqsintegrationresponsesRestApi3BE7E402" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -344,7 +335,16 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Fn::GetAtt": [ + "testapigatewaysqsintegrationresponsesRestApi3BE7E402", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testapigatewaysqsintegrationresponsesRestApi3BE7E402" + } } }, "testapigatewaysqsintegrationresponsesRestApiUsagePlan4172DBF8": { @@ -542,4 +542,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.custom-integration-responses.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-custom-integration-responses.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.custom-integration-responses.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-custom-integration-responses.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.existing-queue.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-existing-queue.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.existing-queue.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-existing-queue.expected.json index fb76a1f8a..95af50d20 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.existing-queue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-existing-queue.expected.json @@ -113,10 +113,10 @@ "testapigatewaysqsexistingqueueRestApiDeploymentA3CB681F40a3b61200f0070439f29a9d27e30e73": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaysqsexistingqueueRestApi2E025EF5" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaysqsexistingqueueRestApiGET860786F8", @@ -136,9 +136,6 @@ "testapigatewaysqsexistingqueueRestApiDeploymentStageprod0DDAF676": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaysqsexistingqueueRestApi2E025EF5" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -159,6 +156,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaysqsexistingqueueRestApi2E025EF5" + }, "StageName": "prod", "TracingEnabled": true } @@ -181,17 +181,8 @@ "testapigatewaysqsexistingqueueRestApiGET860786F8": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Fn::GetAtt": [ - "testapigatewaysqsexistingqueueRestApi2E025EF5", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testapigatewaysqsexistingqueueRestApi2E025EF5" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -260,7 +251,16 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Fn::GetAtt": [ + "testapigatewaysqsexistingqueueRestApi2E025EF5", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testapigatewaysqsexistingqueueRestApi2E025EF5" + } } }, "testapigatewaysqsexistingqueueRestApiUsagePlan02E1D7E7": { @@ -458,4 +458,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.existing-queue.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-existing-queue.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.existing-queue.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-existing-queue.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-no-arguments.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-no-arguments.expected.json index 4797bac67..569e49fc9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-no-arguments.expected.json @@ -201,10 +201,10 @@ "testapigatewaysqsdefaultRestApiDeploymentFB9688F5638eca4a0d71dff702d4b2c6b1d1e2df": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testapigatewaysqsdefaultRestApi554243C3" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testapigatewaysqsdefaultRestApiGET733E6394", @@ -224,9 +224,6 @@ "testapigatewaysqsdefaultRestApiDeploymentStageprod600FEEE2": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testapigatewaysqsdefaultRestApi554243C3" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -247,6 +244,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testapigatewaysqsdefaultRestApi554243C3" + }, "StageName": "prod", "TracingEnabled": true } @@ -269,17 +269,8 @@ "testapigatewaysqsdefaultRestApiGET733E6394": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Fn::GetAtt": [ - "testapigatewaysqsdefaultRestApi554243C3", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testapigatewaysqsdefaultRestApi554243C3" - }, "AuthorizationType": "AWS_IAM", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -348,7 +339,16 @@ }, "StatusCode": "500" } - ] + ], + "ResourceId": { + "Fn::GetAtt": [ + "testapigatewaysqsdefaultRestApi554243C3", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testapigatewaysqsdefaultRestApi554243C3" + } } }, "testapigatewaysqsdefaultRestApiUsagePlan3475CA67": { @@ -546,4 +546,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-customCloudfrontLoggingBucket.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-customCloudfrontLoggingBucket.expected.json index 159abab0a..487b9c752 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-customCloudfrontLoggingBucket.expected.json @@ -99,18 +99,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "cfapigwlambdaLambdaFunctionServiceRole9B40D826", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "cfapigwlambdaLambdaFunctionServiceRole9B40D826", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -172,10 +172,10 @@ "cfapigwlambdaLambdaRestApiDeployment33C24C7D5b6eb6dc887b9e8b9bde9a765f4aacbb": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "cfapigwlambdaLambdaRestApi775C255B" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "cfapigwlambdaLambdaRestApiproxyANY68181290", @@ -196,9 +196,6 @@ "cfapigwlambdaLambdaRestApiDeploymentStageprod83104011": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "cfapigwlambdaLambdaRestApi775C255B" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -219,6 +216,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "cfapigwlambdaLambdaRestApi775C255B" + }, "StageName": "prod", "TracingEnabled": true } @@ -238,7 +238,7 @@ } } }, - "cfapigwlambdaLambdaRestApiproxyANYApiPermissioncustomCloudfrontLoggingBucketcfapigwlambdaLambdaRestApi1C5998E7ANYproxyA3ACBFF5": { + "cfapigwlambdaLambdaRestApiproxyANYApiPermissioncftaplamcustomCloudfrontLoggingBucketcfapigwlambdaLambdaRestApi92F6CCCCANYproxy3A68AEF4": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -279,7 +279,7 @@ } } }, - "cfapigwlambdaLambdaRestApiproxyANYApiPermissionTestcustomCloudfrontLoggingBucketcfapigwlambdaLambdaRestApi1C5998E7ANYproxyAF2D9C87": { + "cfapigwlambdaLambdaRestApiproxyANYApiPermissionTestcftaplamcustomCloudfrontLoggingBucketcfapigwlambdaLambdaRestApi92F6CCCCANYproxyCDE7366D": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -319,14 +319,8 @@ "cfapigwlambdaLambdaRestApiproxyANY68181290": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "cfapigwlambdaLambdaRestApiproxy6A768910" - }, - "RestApiId": { - "Ref": "cfapigwlambdaLambdaRestApi775C255B" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -353,6 +347,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "cfapigwlambdaLambdaRestApiproxy6A768910" + }, + "RestApiId": { + "Ref": "cfapigwlambdaLambdaRestApi775C255B" } }, "Metadata": { @@ -366,7 +366,7 @@ } } }, - "cfapigwlambdaLambdaRestApiANYApiPermissioncustomCloudfrontLoggingBucketcfapigwlambdaLambdaRestApi1C5998E7ANY3C46A898": { + "cfapigwlambdaLambdaRestApiANYApiPermissioncftaplamcustomCloudfrontLoggingBucketcfapigwlambdaLambdaRestApi92F6CCCCANY63987F12": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -407,7 +407,7 @@ } } }, - "cfapigwlambdaLambdaRestApiANYApiPermissionTestcustomCloudfrontLoggingBucketcfapigwlambdaLambdaRestApi1C5998E7ANY2F5B90FD": { + "cfapigwlambdaLambdaRestApiANYApiPermissionTestcftaplamcustomCloudfrontLoggingBucketcfapigwlambdaLambdaRestApi92F6CCCCANYA05B319C": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -447,17 +447,8 @@ "cfapigwlambdaLambdaRestApiANY81C176E9": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "cfapigwlambdaLambdaRestApi775C255B", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "cfapigwlambdaLambdaRestApi775C255B" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -484,6 +475,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "cfapigwlambdaLambdaRestApi775C255B", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "cfapigwlambdaLambdaRestApi775C255B" } }, "Metadata": { @@ -589,13 +589,13 @@ "cfapigwlambdaCloudFrontToApiGatewaySetHttpSecurityHeadersE20F2933": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc8273ed23dc12ef2b23814ad425355213a41659e4f", + "Comment": "SetHttpSecurityHeadersc860b559e82562b55d86431c32566a0eb839407df7", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc8273ed23dc12ef2b23814ad425355213a41659e4f", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc860b559e82562b55d86431c32566a0eb839407df7" } }, "cfapigwlambdaCloudFrontToApiGatewayCloudfrontLoggingBucket2E8E3DC2": { @@ -691,6 +691,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -769,7 +770,7 @@ } } ], - "TargetOriginId": "customCloudfrontLoggingBucketcfapigwlambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin1C90DACBB", + "TargetOriginId": "cftaplamcustomCloudfrontLoggingBucketcfapigwlambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin169FDD6AF", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -835,7 +836,7 @@ } ] }, - "Id": "customCloudfrontLoggingBucketcfapigwlambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin1C90DACBB", + "Id": "cftaplamcustomCloudfrontLoggingBucketcfapigwlambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin169FDD6AF", "OriginPath": { "Fn::Join": [ "", @@ -891,7 +892,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1001,4 +1002,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-customCloudfrontLoggingBucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.customCloudfrontLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-customCloudfrontLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-no-arguments.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-no-arguments.expected.json index 46696cee7..3fe8ae626 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-no-arguments.expected.json @@ -99,18 +99,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "testcloudfrontapigatewaylambdaLambdaFunctionServiceRoleCB74590F", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testcloudfrontapigatewaylambdaLambdaFunctionServiceRoleCB74590F", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -172,10 +172,10 @@ "testcloudfrontapigatewaylambdaLambdaRestApiDeployment0C4661C03abb023c303d9e3ff2b4d984cd5d60ab": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "testcloudfrontapigatewaylambdaLambdaRestApi6A4CBD44" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "testcloudfrontapigatewaylambdaLambdaRestApiproxyANYAE500A13", @@ -196,9 +196,6 @@ "testcloudfrontapigatewaylambdaLambdaRestApiDeploymentStageprod4617A7B7": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "testcloudfrontapigatewaylambdaLambdaRestApi6A4CBD44" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -219,6 +216,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "testcloudfrontapigatewaylambdaLambdaRestApi6A4CBD44" + }, "StageName": "prod", "TracingEnabled": true } @@ -238,7 +238,7 @@ } } }, - "testcloudfrontapigatewaylambdaLambdaRestApiproxyANYApiPermissionnoargumentstestcloudfrontapigatewaylambdaLambdaRestApi48EFA4E6ANYproxy9F8A87CE": { + "testcloudfrontapigatewaylambdaLambdaRestApiproxyANYApiPermissioncftaplamnoargumentstestcloudfrontapigatewaylambdaLambdaRestApiF14A7709ANYproxyB4BC87CC": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -279,7 +279,7 @@ } } }, - "testcloudfrontapigatewaylambdaLambdaRestApiproxyANYApiPermissionTestnoargumentstestcloudfrontapigatewaylambdaLambdaRestApi48EFA4E6ANYproxy9EBF2E85": { + "testcloudfrontapigatewaylambdaLambdaRestApiproxyANYApiPermissionTestcftaplamnoargumentstestcloudfrontapigatewaylambdaLambdaRestApiF14A7709ANYproxy647FCDDD": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -319,14 +319,8 @@ "testcloudfrontapigatewaylambdaLambdaRestApiproxyANYAE500A13": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "testcloudfrontapigatewaylambdaLambdaRestApiproxyBC09D86F" - }, - "RestApiId": { - "Ref": "testcloudfrontapigatewaylambdaLambdaRestApi6A4CBD44" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -353,6 +347,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "testcloudfrontapigatewaylambdaLambdaRestApiproxyBC09D86F" + }, + "RestApiId": { + "Ref": "testcloudfrontapigatewaylambdaLambdaRestApi6A4CBD44" } }, "Metadata": { @@ -366,7 +366,7 @@ } } }, - "testcloudfrontapigatewaylambdaLambdaRestApiANYApiPermissionnoargumentstestcloudfrontapigatewaylambdaLambdaRestApi48EFA4E6ANYAF9AD91E": { + "testcloudfrontapigatewaylambdaLambdaRestApiANYApiPermissioncftaplamnoargumentstestcloudfrontapigatewaylambdaLambdaRestApiF14A7709ANY1BADAD44": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -407,7 +407,7 @@ } } }, - "testcloudfrontapigatewaylambdaLambdaRestApiANYApiPermissionTestnoargumentstestcloudfrontapigatewaylambdaLambdaRestApi48EFA4E6ANY7C6CF5D5": { + "testcloudfrontapigatewaylambdaLambdaRestApiANYApiPermissionTestcftaplamnoargumentstestcloudfrontapigatewaylambdaLambdaRestApiF14A7709ANYA87D989E": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -447,17 +447,8 @@ "testcloudfrontapigatewaylambdaLambdaRestApiANYBC435DFD": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "testcloudfrontapigatewaylambdaLambdaRestApi6A4CBD44", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "testcloudfrontapigatewaylambdaLambdaRestApi6A4CBD44" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -484,6 +475,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "testcloudfrontapigatewaylambdaLambdaRestApi6A4CBD44", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "testcloudfrontapigatewaylambdaLambdaRestApi6A4CBD44" } }, "Metadata": { @@ -589,13 +589,13 @@ "testcloudfrontapigatewaylambdaCloudFrontToApiGatewaySetHttpSecurityHeaders6945414A": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc8118ca6b46a588ddfb2f1826effa6addb3adda75e", + "Comment": "SetHttpSecurityHeadersc87d9e55c0a6a55f893f95e9a700c7ce19634229d0", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc8118ca6b46a588ddfb2f1826effa6addb3adda75e", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc87d9e55c0a6a55f893f95e9a700c7ce19634229d0" } }, "testcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudfrontLoggingBucket7F467421": { @@ -691,6 +691,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -769,7 +770,7 @@ } } ], - "TargetOriginId": "noargumentstestcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin1E0B3F41B", + "TargetOriginId": "cftaplamnoargumentstestcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin14C55B0B8", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -835,7 +836,7 @@ } ] }, - "Id": "noargumentstestcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin1E0B3F41B", + "Id": "cftaplamnoargumentstestcloudfrontapigatewaylambdaCloudFrontToApiGatewayCloudFrontDistributionOrigin14C55B0B8", "OriginPath": { "Fn::Join": [ "", @@ -891,7 +892,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1001,4 +1002,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-override-behavior.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-override-behavior.expected.json index 120092782..d5398b174 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-override-behavior.expected.json @@ -147,18 +147,18 @@ }, "S3Key": "42a35bbf0dec9ef0ac5b0dde87e71a1b8929e8d2d178dd09ccfb2c928ec0198c.zip" }, - "Role": { - "Fn::GetAtt": [ - "cfapilambdaoverrideLambdaFunctionServiceRole4B1A4043", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "cfapilambdaoverrideLambdaFunctionServiceRole4B1A4043", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -220,10 +220,10 @@ "cfapilambdaoverrideLambdaRestApiDeployment82ACBB00e7f3a114a506221ddcaf53765c4dd518": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "cfapilambdaoverrideLambdaRestApidynamicGET15050D54", @@ -245,9 +245,6 @@ "cfapilambdaoverrideLambdaRestApiDeploymentStageprodC4F6FBB5": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -268,6 +265,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" + }, "StageName": "prod", "TracingEnabled": true } @@ -290,18 +290,18 @@ "cfapilambdaoverrideLambdaRestApistaticGET81EF9C24": { "Type": "AWS::ApiGateway::Method", "Properties": { + "AuthorizationType": "NONE", "HttpMethod": "GET", + "Integration": { + "IntegrationHttpMethod": "GET", + "Type": "HTTP_PROXY", + "Uri": "http://amazon.com" + }, "ResourceId": { "Ref": "cfapilambdaoverrideLambdaRestApistaticC2ECB649" }, "RestApiId": { "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" - }, - "AuthorizationType": "NONE", - "Integration": { - "IntegrationHttpMethod": "GET", - "Type": "HTTP_PROXY", - "Uri": "http://amazon.com" } }, "Metadata": { @@ -330,7 +330,7 @@ } } }, - "cfapilambdaoverrideLambdaRestApidynamicGETApiPermissionoverridebehaviorcfapilambdaoverrideLambdaRestApi38D1477BGETdynamic7D0BDE06": { + "cfapilambdaoverrideLambdaRestApidynamicGETApiPermissioncftaplamoverridebehaviorcfapilambdaoverrideLambdaRestApiE3676062GETdynamic9C58B7B8": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -371,7 +371,7 @@ } } }, - "cfapilambdaoverrideLambdaRestApidynamicGETApiPermissionTestoverridebehaviorcfapilambdaoverrideLambdaRestApi38D1477BGETdynamic8C94F569": { + "cfapilambdaoverrideLambdaRestApidynamicGETApiPermissionTestcftaplamoverridebehaviorcfapilambdaoverrideLambdaRestApiE3676062GETdynamic5810873D": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -411,14 +411,8 @@ "cfapilambdaoverrideLambdaRestApidynamicGET15050D54": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "GET", - "ResourceId": { - "Ref": "cfapilambdaoverrideLambdaRestApidynamic88206171" - }, - "RestApiId": { - "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" - }, "AuthorizationType": "NONE", + "HttpMethod": "GET", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -445,6 +439,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "cfapilambdaoverrideLambdaRestApidynamic88206171" + }, + "RestApiId": { + "Ref": "cfapilambdaoverrideLambdaRestApi6E7952FC" } }, "Metadata": { @@ -550,13 +550,13 @@ "cfapilambdaoverrideCloudFrontToApiGatewaySetHttpSecurityHeaders67E61E6E": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc82a9e79410026b75533b53f0a37eeb986a591fa95", + "Comment": "SetHttpSecurityHeadersc826c2a6a3ffe209aed33765f37752084820de0d3b", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc82a9e79410026b75533b53f0a37eeb986a591fa95", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc826c2a6a3ffe209aed33765f37752084820de0d3b" } }, "cfapilambdaoverrideCloudFrontToApiGatewayCloudfrontLoggingBucket3A71B9E0": { @@ -652,6 +652,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -723,7 +724,7 @@ }, "Compress": true, "PathPattern": "/dynamic", - "TargetOriginId": "overridebehaviorcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin2DA299FBD", + "TargetOriginId": "cftaplamoverridebehaviorcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin2D0C9421C", "ViewerProtocolPolicy": "allow-all" } ], @@ -743,7 +744,7 @@ } } ], - "TargetOriginId": "overridebehaviorcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin153BCD088", + "TargetOriginId": "cftaplamoverridebehaviorcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin14C42522D", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -809,7 +810,7 @@ } ] }, - "Id": "overridebehaviorcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin153BCD088", + "Id": "cftaplamoverridebehaviorcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin14C42522D", "OriginPath": { "Fn::Join": [ "", @@ -873,7 +874,7 @@ } ] }, - "Id": "overridebehaviorcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin2DA299FBD", + "Id": "cftaplamoverridebehaviorcfapilambdaoverrideCloudFrontToApiGatewayCloudFrontDistributionOrigin2D0C9421C", "OriginPath": { "Fn::Join": [ "", @@ -930,7 +931,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1040,4 +1041,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-override-behavior.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.override-behavior.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway-lambda/test/integ.cftaplam-override-behavior.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-customCloudfrontLoggingBucket.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-customCloudfrontLoggingBucket.expected.json index 954c1541e..4396bedcb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-customCloudfrontLoggingBucket.expected.json @@ -99,18 +99,18 @@ }, "S3Key": "3a18fd3de4803f72260a058823accffd4f8d69986c6862a23cd86265f6cafa0f.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -172,10 +172,10 @@ "LambdaRestApiDeploymentBA640578812946cff1910fe2b8b339ee3a8d51c7": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "LambdaRestApi95870433" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "LambdaRestApiproxyANY93D43CC0", @@ -196,9 +196,6 @@ "LambdaRestApiDeploymentStageprodB1F3862A": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "LambdaRestApi95870433" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -219,6 +216,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "LambdaRestApi95870433" + }, "StageName": "prod", "TracingEnabled": true } @@ -238,7 +238,7 @@ } } }, - "LambdaRestApiproxyANYApiPermissioncustomCloudfrontLoggingBucketLambdaRestApiB3C97BC3ANYproxyB2970EF0": { + "LambdaRestApiproxyANYApiPermissioncftapicustomCloudfrontLoggingBucketLambdaRestApi99E9E0A2ANYproxyD8618381": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -279,7 +279,7 @@ } } }, - "LambdaRestApiproxyANYApiPermissionTestcustomCloudfrontLoggingBucketLambdaRestApiB3C97BC3ANYproxyB96C3608": { + "LambdaRestApiproxyANYApiPermissionTestcftapicustomCloudfrontLoggingBucketLambdaRestApi99E9E0A2ANYproxy9C09767F": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -319,14 +319,8 @@ "LambdaRestApiproxyANY93D43CC0": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "LambdaRestApiproxy9F99E187" - }, - "RestApiId": { - "Ref": "LambdaRestApi95870433" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -353,6 +347,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "LambdaRestApiproxy9F99E187" + }, + "RestApiId": { + "Ref": "LambdaRestApi95870433" } }, "Metadata": { @@ -366,7 +366,7 @@ } } }, - "LambdaRestApiANYApiPermissioncustomCloudfrontLoggingBucketLambdaRestApiB3C97BC3ANY61586206": { + "LambdaRestApiANYApiPermissioncftapicustomCloudfrontLoggingBucketLambdaRestApi99E9E0A2ANY7163B9C3": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -407,7 +407,7 @@ } } }, - "LambdaRestApiANYApiPermissionTestcustomCloudfrontLoggingBucketLambdaRestApiB3C97BC3ANYBE8D9316": { + "LambdaRestApiANYApiPermissionTestcftapicustomCloudfrontLoggingBucketLambdaRestApi99E9E0A2ANY57980E7B": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -447,17 +447,8 @@ "LambdaRestApiANYA831AD87": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "LambdaRestApi95870433", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "LambdaRestApi95870433" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -484,6 +475,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "LambdaRestApi95870433", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "LambdaRestApi95870433" } }, "Metadata": { @@ -589,13 +589,13 @@ "cfapigwSetHttpSecurityHeaders07A0F0C0": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc8fc067b45a5c199a519a90c3b5f02d380f1625f1d", + "Comment": "SetHttpSecurityHeadersc8cc607f355edae7717ef60e6468962d623a2d5ea9", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc8fc067b45a5c199a519a90c3b5f02d380f1625f1d", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc8cc607f355edae7717ef60e6468962d623a2d5ea9" } }, "cfapigwCloudfrontLoggingBucket79FE4195": { @@ -691,6 +691,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -769,7 +770,7 @@ } } ], - "TargetOriginId": "customCloudfrontLoggingBucketcfapigwCloudFrontDistributionOrigin1D25D62E1", + "TargetOriginId": "cftapicustomCloudfrontLoggingBucketcfapigwCloudFrontDistributionOrigin150F4E889", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -835,7 +836,7 @@ } ] }, - "Id": "customCloudfrontLoggingBucketcfapigwCloudFrontDistributionOrigin1D25D62E1", + "Id": "cftapicustomCloudfrontLoggingBucketcfapigwCloudFrontDistributionOrigin150F4E889", "OriginPath": { "Fn::Join": [ "", @@ -891,7 +892,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1001,4 +1002,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-customCloudfrontLoggingBucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.customCloudfrontLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-customCloudfrontLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-no-arguments.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-no-arguments.expected.json index ba44a3a00..911ae50a2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-no-arguments.expected.json @@ -99,18 +99,18 @@ }, "S3Key": "3a18fd3de4803f72260a058823accffd4f8d69986c6862a23cd86265f6cafa0f.zip" }, - "Role": { - "Fn::GetAtt": [ - "LambdaFunctionServiceRole0C4CDE0B", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LambdaFunctionServiceRole0C4CDE0B", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -172,10 +172,10 @@ "LambdaRestApiDeploymentBA640578812946cff1910fe2b8b339ee3a8d51c7": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "LambdaRestApi95870433" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "LambdaRestApiproxyANY93D43CC0", @@ -196,9 +196,6 @@ "LambdaRestApiDeploymentStageprodB1F3862A": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "LambdaRestApi95870433" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -219,6 +216,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "LambdaRestApi95870433" + }, "StageName": "prod", "TracingEnabled": true } @@ -238,7 +238,7 @@ } } }, - "LambdaRestApiproxyANYApiPermissionnoargumentsLambdaRestApi1B816FD2ANYproxyBDE6648C": { + "LambdaRestApiproxyANYApiPermissioncftapinoargumentsLambdaRestApiF940E0B7ANYproxyB0743A1B": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -279,7 +279,7 @@ } } }, - "LambdaRestApiproxyANYApiPermissionTestnoargumentsLambdaRestApi1B816FD2ANYproxyC33E886D": { + "LambdaRestApiproxyANYApiPermissionTestcftapinoargumentsLambdaRestApiF940E0B7ANYproxy3C8A7D38": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -319,14 +319,8 @@ "LambdaRestApiproxyANY93D43CC0": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Ref": "LambdaRestApiproxy9F99E187" - }, - "RestApiId": { - "Ref": "LambdaRestApi95870433" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -353,6 +347,12 @@ ] ] } + }, + "ResourceId": { + "Ref": "LambdaRestApiproxy9F99E187" + }, + "RestApiId": { + "Ref": "LambdaRestApi95870433" } }, "Metadata": { @@ -366,7 +366,7 @@ } } }, - "LambdaRestApiANYApiPermissionnoargumentsLambdaRestApi1B816FD2ANYA28D6642": { + "LambdaRestApiANYApiPermissioncftapinoargumentsLambdaRestApiF940E0B7ANY40A5EEFB": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -407,7 +407,7 @@ } } }, - "LambdaRestApiANYApiPermissionTestnoargumentsLambdaRestApi1B816FD2ANY084A62B7": { + "LambdaRestApiANYApiPermissionTestcftapinoargumentsLambdaRestApiF940E0B7ANYDA8F06BF": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -447,17 +447,8 @@ "LambdaRestApiANYA831AD87": { "Type": "AWS::ApiGateway::Method", "Properties": { - "HttpMethod": "ANY", - "ResourceId": { - "Fn::GetAtt": [ - "LambdaRestApi95870433", - "RootResourceId" - ] - }, - "RestApiId": { - "Ref": "LambdaRestApi95870433" - }, "AuthorizationType": "NONE", + "HttpMethod": "ANY", "Integration": { "IntegrationHttpMethod": "POST", "Type": "AWS_PROXY", @@ -484,6 +475,15 @@ ] ] } + }, + "ResourceId": { + "Fn::GetAtt": [ + "LambdaRestApi95870433", + "RootResourceId" + ] + }, + "RestApiId": { + "Ref": "LambdaRestApi95870433" } }, "Metadata": { @@ -589,13 +589,13 @@ "testcloudfrontapigatewaySetHttpSecurityHeadersD8DBA642": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc86815c5ef0b0f2cdd73c6957ce5bbd25e8f895b9b", + "Comment": "SetHttpSecurityHeadersc8b8093f33c7dec7c3b269919bb775882671d92f95", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc86815c5ef0b0f2cdd73c6957ce5bbd25e8f895b9b", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc8b8093f33c7dec7c3b269919bb775882671d92f95" } }, "testcloudfrontapigatewayCloudfrontLoggingBucket9811F6E8": { @@ -691,6 +691,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -769,7 +770,7 @@ } } ], - "TargetOriginId": "noargumentstestcloudfrontapigatewayCloudFrontDistributionOrigin154FE4EF8", + "TargetOriginId": "cftapinoargumentstestcloudfrontapigatewayCloudFrontDistributionOrigin187166803", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -835,7 +836,7 @@ } ] }, - "Id": "noargumentstestcloudfrontapigatewayCloudFrontDistributionOrigin154FE4EF8", + "Id": "cftapinoargumentstestcloudfrontapigatewayCloudFrontDistributionOrigin187166803", "OriginPath": { "Fn::Join": [ "", @@ -891,7 +892,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1001,4 +1002,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-customCloudFrontLoggingBucket.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-customCloudFrontLoggingBucket.expected.json index 1dda93107..f6efa9c26 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-customCloudFrontLoggingBucket.expected.json @@ -26,10 +26,10 @@ "cloudfrontmediastoreMediaStoreContainer1772C1D5": { "Type": "AWS::MediaStore::Container", "Properties": { + "AccessLoggingEnabled": true, "ContainerName": { "Ref": "AWS::StackName" }, - "AccessLoggingEnabled": true, "CorsPolicy": [ { "AllowedHeaders": [ @@ -175,6 +175,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -276,13 +277,13 @@ "cloudfrontmediastoreSetHttpSecurityHeadersC55C3265": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc80b17555ef95835e434ce55c4536b557a9baf1262", + "Comment": "SetHttpSecurityHeadersc81207803c6e843456a3ffad1566fa3c93edc3a910", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc80b17555ef95835e434ce55c4536b557a9baf1262", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc81207803c6e843456a3ffad1566fa3c93edc3a910" } }, "cloudfrontmediastoreCloudFrontDistribution639346BB": { @@ -316,7 +317,7 @@ "OriginRequestPolicyId": { "Ref": "cloudfrontmediastoreCloudfrontOriginRequestPolicyC99EB0D7" }, - "TargetOriginId": "customCloudFrontLoggingBucketcloudfrontmediastoreCloudFrontDistributionOrigin1ABFFF077", + "TargetOriginId": "cftmedcustomCloudFrontLoggingBucketcloudfrontmediastoreCloudFrontDistributionOrigin155C3A2EE", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -364,7 +365,7 @@ } ] }, - "Id": "customCloudFrontLoggingBucketcloudfrontmediastoreCloudFrontDistributionOrigin1ABFFF077", + "Id": "cftmedcustomCloudFrontLoggingBucketcloudfrontmediastoreCloudFrontDistributionOrigin155C3A2EE", "OriginCustomHeaders": [ { "HeaderName": "User-Agent", @@ -417,7 +418,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-customCloudFrontLoggingBucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.customCloudFrontLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-customCloudFrontLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-default.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-default.expected.json index 017e02b08..293b2d1e4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-default.expected.json @@ -26,10 +26,10 @@ "testcloudfrontmediastoreMediaStoreContainerF60A96BB": { "Type": "AWS::MediaStore::Container", "Properties": { + "AccessLoggingEnabled": true, "ContainerName": { "Ref": "AWS::StackName" }, - "AccessLoggingEnabled": true, "CorsPolicy": [ { "AllowedHeaders": [ @@ -175,6 +175,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -276,13 +277,13 @@ "testcloudfrontmediastoreSetHttpSecurityHeaders9995A63D": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc85e0befbf4ed85d473981453c3bd34f0a97efbe49", + "Comment": "SetHttpSecurityHeadersc8fc38070dfbd4b29ae6ce900d59a286fe30194d37", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc85e0befbf4ed85d473981453c3bd34f0a97efbe49", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc8fc38070dfbd4b29ae6ce900d59a286fe30194d37" } }, "testcloudfrontmediastoreCloudFrontDistributionED9265B1": { @@ -316,7 +317,7 @@ "OriginRequestPolicyId": { "Ref": "testcloudfrontmediastoreCloudfrontOriginRequestPolicyA1D988D3" }, - "TargetOriginId": "defaulttestcloudfrontmediastoreCloudFrontDistributionOrigin104C1DF32", + "TargetOriginId": "cftmeddefaulttestcloudfrontmediastoreCloudFrontDistributionOrigin18FCE310D", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -364,7 +365,7 @@ } ] }, - "Id": "defaulttestcloudfrontmediastoreCloudFrontDistributionOrigin104C1DF32", + "Id": "cftmeddefaulttestcloudfrontmediastoreCloudFrontDistributionOrigin18FCE310D", "OriginCustomHeaders": [ { "HeaderName": "User-Agent", @@ -417,7 +418,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-default.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.default.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-default.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-existingContainer.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-existingContainer.expected.json index 4685cedc1..f696b89fb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-existingContainer.expected.json @@ -100,6 +100,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -201,13 +202,13 @@ "testcloudfrontmediastoreSetHttpSecurityHeaders9995A63D": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc8671d40ce388b672e8795a9218fe7e3f368379f42", + "Comment": "SetHttpSecurityHeadersc81c3292af2c681c7c1a90878198ca9e244a6d4b59", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc8671d40ce388b672e8795a9218fe7e3f368379f42", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc81c3292af2c681c7c1a90878198ca9e244a6d4b59" } }, "testcloudfrontmediastoreCloudFrontDistributionED9265B1": { @@ -241,7 +242,7 @@ "OriginRequestPolicyId": { "Ref": "testcloudfrontmediastoreCloudfrontOriginRequestPolicyA1D988D3" }, - "TargetOriginId": "existingContainertestcloudfrontmediastoreCloudFrontDistributionOrigin18E12B71C", + "TargetOriginId": "cftmedexistingContainertestcloudfrontmediastoreCloudFrontDistributionOrigin197FFCE03", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -289,7 +290,7 @@ } ] }, - "Id": "existingContainertestcloudfrontmediastoreCloudFrontDistributionOrigin18E12B71C" + "Id": "cftmedexistingContainertestcloudfrontmediastoreCloudFrontDistributionOrigin197FFCE03" } ] } @@ -334,7 +335,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-existingContainer.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.existingContainer.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-existingContainer.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-overrideProperties.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-overrideProperties.expected.json index b7373e8e3..b94760369 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-overrideProperties.expected.json @@ -4,8 +4,8 @@ "testcloudfrontmediastoreMediaStoreContainerF60A96BB": { "Type": "AWS::MediaStore::Container", "Properties": { - "ContainerName": "MyOwnMediaStoreContainer", "AccessLoggingEnabled": true, + "ContainerName": "MyOwnMediaStoreContainer", "CorsPolicy": [ { "AllowedHeaders": [ @@ -139,6 +139,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -240,13 +241,13 @@ "testcloudfrontmediastoreSetHttpSecurityHeaders9995A63D": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc8f338626119f90653fe964a54eb18cb4a8d6406ce", + "Comment": "SetHttpSecurityHeadersc834ed9460f71cbf9e095fdd5f74b7899e8b403a13", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc8f338626119f90653fe964a54eb18cb4a8d6406ce", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc834ed9460f71cbf9e095fdd5f74b7899e8b403a13" } }, "testcloudfrontmediastoreCloudFrontDistributionED9265B1": { @@ -283,7 +284,7 @@ "OriginRequestPolicyId": { "Ref": "testcloudfrontmediastoreCloudfrontOriginRequestPolicyA1D988D3" }, - "TargetOriginId": "overridePropertiestestcloudfrontmediastoreCloudFrontDistributionOrigin1120F47FC", + "TargetOriginId": "cftmedoverridePropertiestestcloudfrontmediastoreCloudFrontDistributionOrigin164C330F3", "ViewerProtocolPolicy": "https-only" }, "Enabled": true, @@ -331,7 +332,7 @@ } ] }, - "Id": "overridePropertiestestcloudfrontmediastoreCloudFrontDistributionOrigin1120F47FC" + "Id": "cftmedoverridePropertiestestcloudfrontmediastoreCloudFrontDistributionOrigin164C330F3" } ] } @@ -376,7 +377,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-overrideProperties.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.overrideProperties.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-overrideProperties.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withSecurityHeaderBehavior.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withSecurityHeaderBehavior.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withSecurityHeaderBehavior.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withSecurityHeaderBehavior.expected.json index 5d05ca67e..b587f4fbc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withSecurityHeaderBehavior.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withSecurityHeaderBehavior.expected.json @@ -26,10 +26,10 @@ "testcloudfrontmediastoreMediaStoreContainerF60A96BB": { "Type": "AWS::MediaStore::Container", "Properties": { + "AccessLoggingEnabled": true, "ContainerName": { "Ref": "AWS::StackName" }, - "AccessLoggingEnabled": true, "CorsPolicy": [ { "AllowedHeaders": [ @@ -214,7 +214,7 @@ "Type": "AWS::CloudFront::ResponseHeadersPolicy", "Properties": { "ResponseHeadersPolicyConfig": { - "Name": "withSecurityHeaderBehaviortestcloudfrontmediastoreResponseHeadersPolicyA685DA47", + "Name": "cftmedwithSecurityHeaderBehaviortestcloudfrontmediastoreResponseHeadersPolicy9AD9613C", "SecurityHeadersConfig": { "ContentSecurityPolicy": { "ContentSecurityPolicy": "upgrade-insecure-requests; default-src 'none';", @@ -253,7 +253,7 @@ "ResponseHeadersPolicyId": { "Ref": "testcloudfrontmediastoreResponseHeadersPolicyE359AC46" }, - "TargetOriginId": "withSecurityHeaderBehaviortestcloudfrontmediastoreCloudFrontDistributionOrigin1F2E772A7", + "TargetOriginId": "cftmedwithSecurityHeaderBehaviortestcloudfrontmediastoreCloudFrontDistributionOrigin19AE9261A", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -301,7 +301,7 @@ } ] }, - "Id": "withSecurityHeaderBehaviortestcloudfrontmediastoreCloudFrontDistributionOrigin1F2E772A7", + "Id": "cftmedwithSecurityHeaderBehaviortestcloudfrontmediastoreCloudFrontDistributionOrigin19AE9261A", "OriginCustomHeaders": [ { "HeaderName": "User-Agent", diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withSecurityHeaderBehavior.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withSecurityHeaderBehavior.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withSecurityHeaderBehavior.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withSecurityHeaderBehavior.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withoutHttpSecurityHeaders.expected.json similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withoutHttpSecurityHeaders.expected.json index f32082de5..12191e2fe 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withoutHttpSecurityHeaders.expected.json @@ -26,10 +26,10 @@ "testcloudfrontmediastoreMediaStoreContainerF60A96BB": { "Type": "AWS::MediaStore::Container", "Properties": { + "AccessLoggingEnabled": true, "ContainerName": { "Ref": "AWS::StackName" }, - "AccessLoggingEnabled": true, "CorsPolicy": [ { "AllowedHeaders": [ @@ -175,6 +175,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -293,7 +294,7 @@ "OriginRequestPolicyId": { "Ref": "testcloudfrontmediastoreCloudfrontOriginRequestPolicyA1D988D3" }, - "TargetOriginId": "withoutHttpSecurityHeaderstestcloudfrontmediastoreCloudFrontDistributionOrigin1E9279918", + "TargetOriginId": "cftmedwithoutHttpSecurityHeaderstestcloudfrontmediastoreCloudFrontDistributionOrigin188E58576", "ViewerProtocolPolicy": "redirect-to-https" }, "Enabled": true, @@ -341,7 +342,7 @@ } ] }, - "Id": "withoutHttpSecurityHeaderstestcloudfrontmediastoreCloudFrontDistributionOrigin1E9279918", + "Id": "cftmedwithoutHttpSecurityHeaderstestcloudfrontmediastoreCloudFrontDistributionOrigin188E58576", "OriginCustomHeaders": [ { "HeaderName": "User-Agent", @@ -394,7 +395,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withoutHttpSecurityHeaders.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.withoutHttpSecurityHeaders.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-mediastore/test/integ.cftmed-withoutHttpSecurityHeaders.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-headers.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-headers.expected.json index 266cdd2a2..f00c3051e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-headers.expected.json @@ -4,6 +4,7 @@ "MyFunction3BAA72D1": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; base-uri 'self'; img-src 'self'; script-src 'self'; style-src 'self' https:; object-src 'none'; frame-ancestors 'none'; font-src 'self' https:; form-action 'self'; manifest-src 'self'; connect-src 'self'\" }; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; headers['referrer-policy'] = { value: 'same-origin' }; return response; }", "FunctionConfig": { "Comment": { @@ -13,7 +14,7 @@ { "Ref": "AWS::Region" }, - "customsecurityheadersMyFunctionFAC550FB" + "cfts3customheadersMyFunction7C965360" ] ] }, @@ -26,11 +27,10 @@ { "Ref": "AWS::Region" }, - "customsecurityheadersMyFunctionFAC550FB" + "cfts3customheadersMyFunction7C965360" ] ] - }, - "AutoPublish": true + } } }, "testcloudfronts3S3LoggingBucket90D239DD": { @@ -244,6 +244,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -343,13 +344,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc8132e0ba07d4c8fdbdb431ae46eef456c0589cb21", + "Comment": "SetHttpSecurityHeadersc8da5865185980f6eb00e7dd351786a8b49cd2929e", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc8132e0ba07d4c8fdbdb431ae46eef456c0589cb21", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc8da5865185980f6eb00e7dd351786a8b49cd2929e" } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -445,6 +446,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -509,7 +511,7 @@ "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", "Properties": { "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Identity for customsecurityheaderstestcloudfronts3CloudFrontDistributionOrigin1FCAF9C77" + "Comment": "Identity for cfts3customheaderstestcloudfronts3CloudFrontDistributionOrigin126E0E496" } } }, @@ -531,7 +533,7 @@ } } ], - "TargetOriginId": "customsecurityheaderstestcloudfronts3CloudFrontDistributionOrigin1FCAF9C77", + "TargetOriginId": "cfts3customheaderstestcloudfronts3CloudFrontDistributionOrigin126E0E496", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -554,7 +556,7 @@ "RegionalDomainName" ] }, - "Id": "customsecurityheaderstestcloudfronts3CloudFrontDistributionOrigin1FCAF9C77", + "Id": "cfts3customheaderstestcloudfronts3CloudFrontDistributionOrigin126E0E496", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -612,7 +614,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-headers.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-security-headers.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-headers.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-originPath.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-originPath.expected.json index aa9a6f24b..e49b49920 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-originPath.expected.json @@ -212,6 +212,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -311,13 +312,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc824484dfea4176847245e871498ffd7e454223fe4", + "Comment": "SetHttpSecurityHeadersc8966f7b24c95d47868a69c8831fbd3ccac3fa3d70", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc824484dfea4176847245e871498ffd7e454223fe4", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc8966f7b24c95d47868a69c8831fbd3ccac3fa3d70" } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -413,6 +414,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -477,7 +479,7 @@ "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", "Properties": { "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Identity for customoriginPathtestcloudfronts3CloudFrontDistributionOrigin1B44CC042" + "Comment": "Identity for cfts3customoriginPathtestcloudfronts3CloudFrontDistributionOrigin1AE2DDD7C" } } }, @@ -499,7 +501,7 @@ } } ], - "TargetOriginId": "customoriginPathtestcloudfronts3CloudFrontDistributionOrigin1B44CC042", + "TargetOriginId": "cfts3customoriginPathtestcloudfronts3CloudFrontDistributionOrigin1AE2DDD7C", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -522,7 +524,7 @@ "RegionalDomainName" ] }, - "Id": "customoriginPathtestcloudfronts3CloudFrontDistributionOrigin1B44CC042", + "Id": "cfts3customoriginPathtestcloudfronts3CloudFrontDistributionOrigin1AE2DDD7C", "OriginPath": "/testPath", "S3OriginConfig": { "OriginAccessIdentity": { @@ -581,7 +583,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-originPath.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.custom-originPath.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-custom-originPath.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customCloudFrontLoggingBucket.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customCloudFrontLoggingBucket.expected.json index 5b99a5606..ecd890e66 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customCloudFrontLoggingBucket.expected.json @@ -212,6 +212,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -311,13 +312,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc88d4d30b2e66a3bd009aa7f11e35596ee70824ece", + "Comment": "SetHttpSecurityHeadersc853f5cf48adabb9680b666a0c549e9b779fe54127", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc88d4d30b2e66a3bd009aa7f11e35596ee70824ece", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc853f5cf48adabb9680b666a0c549e9b779fe54127" } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -413,6 +414,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -477,7 +479,7 @@ "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", "Properties": { "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Identity for customCloudFrontLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin115B4D0FD" + "Comment": "Identity for cfts3customCloudFrontLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin18A4ECB64" } } }, @@ -499,7 +501,7 @@ } } ], - "TargetOriginId": "customCloudFrontLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin115B4D0FD", + "TargetOriginId": "cfts3customCloudFrontLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin18A4ECB64", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -522,7 +524,7 @@ "RegionalDomainName" ] }, - "Id": "customCloudFrontLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin115B4D0FD", + "Id": "cfts3customCloudFrontLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin18A4ECB64", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -580,7 +582,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customCloudFrontLoggingBucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customCloudFrontLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customCloudFrontLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customLoggingBucket.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customLoggingBucket.expected.json index 1a5473490..9654a03cf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customLoggingBucket.expected.json @@ -86,6 +86,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -275,6 +276,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -374,13 +376,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc8adfb824ff76ff8867fe60ef9e02c0d312ebd9f83", + "Comment": "SetHttpSecurityHeadersc8c3d2243132d57b810e98b12d9e3c4c64e6e1cabe", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc8adfb824ff76ff8867fe60ef9e02c0d312ebd9f83", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc8c3d2243132d57b810e98b12d9e3c4c64e6e1cabe" } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -476,6 +478,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -540,7 +543,7 @@ "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", "Properties": { "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Identity for customLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin10D3900D7" + "Comment": "Identity for cfts3customLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin169BF6A51" } } }, @@ -562,7 +565,7 @@ } } ], - "TargetOriginId": "customLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin10D3900D7", + "TargetOriginId": "cfts3customLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin169BF6A51", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -585,7 +588,7 @@ "RegionalDomainName" ] }, - "Id": "customLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin10D3900D7", + "Id": "cfts3customLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin169BF6A51", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -643,7 +646,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customLoggingBucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.customLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-customLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-existing-bucket.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-existing-bucket.expected.json index 6aaa2e8cf..de1f4c341 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-existing-bucket.expected.json @@ -53,6 +53,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -204,7 +205,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -254,13 +255,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc87bceb93c12dbe589df4f4994a0258334a9b78e4a", + "Comment": "SetHttpSecurityHeadersc8321a2c9fa54d380831d390bfbd7aff27f99fd427", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc87bceb93c12dbe589df4f4994a0258334a9b78e4a", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc8321a2c9fa54d380831d390bfbd7aff27f99fd427" } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -356,6 +357,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -420,7 +422,7 @@ "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", "Properties": { "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Identity for existingbuckettestcloudfronts3CloudFrontDistributionOrigin1F40EF14E" + "Comment": "Identity for cfts3existingbuckettestcloudfronts3CloudFrontDistributionOrigin10617473F" } } }, @@ -435,7 +437,7 @@ }, "Compress": true, "PathPattern": "/images/*.jpg", - "TargetOriginId": "existingbuckettestcloudfronts3CloudFrontDistributionOrigin2EB6A4DC9", + "TargetOriginId": "cfts3existingbuckettestcloudfronts3CloudFrontDistributionOrigin28690577F", "ViewerProtocolPolicy": "allow-all" } ], @@ -453,7 +455,7 @@ } } ], - "TargetOriginId": "existingbuckettestcloudfronts3CloudFrontDistributionOrigin1F40EF14E", + "TargetOriginId": "cfts3existingbuckettestcloudfronts3CloudFrontDistributionOrigin10617473F", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -476,7 +478,7 @@ "RegionalDomainName" ] }, - "Id": "existingbuckettestcloudfronts3CloudFrontDistributionOrigin1F40EF14E", + "Id": "cfts3existingbuckettestcloudfronts3CloudFrontDistributionOrigin10617473F", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -498,7 +500,7 @@ "RegionalDomainName" ] }, - "Id": "existingbuckettestcloudfronts3CloudFrontDistributionOrigin2EB6A4DC9", + "Id": "cfts3existingbuckettestcloudfronts3CloudFrontDistributionOrigin28690577F", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -531,7 +533,7 @@ "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", "Properties": { "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Identity for existingbuckettestcloudfronts3CloudFrontDistributionOrigin2EB6A4DC9" + "Comment": "Identity for cfts3existingbuckettestcloudfronts3CloudFrontDistributionOrigin28690577F" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-existing-bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.existing-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-existing-bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-arguments.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-arguments.expected.json index 6fdb685d1..f050b41cd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-arguments.expected.json @@ -99,6 +99,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -198,13 +199,13 @@ "testcloudfronts3SetHttpSecurityHeaders6C5A1E69": { "Type": "AWS::CloudFront::Function", "Properties": { + "AutoPublish": true, "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }", "FunctionConfig": { - "Comment": "SetHttpSecurityHeadersc8075c5215eb89e52dc0db6c01788e90b8e754531c", + "Comment": "SetHttpSecurityHeadersc88b3e0fe5ebfb7f401b410752c35f74a3678d5cb1", "Runtime": "cloudfront-js-1.0" }, - "Name": "SetHttpSecurityHeadersc8075c5215eb89e52dc0db6c01788e90b8e754531c", - "AutoPublish": true + "Name": "SetHttpSecurityHeadersc88b3e0fe5ebfb7f401b410752c35f74a3678d5cb1" } }, "testcloudfronts3CloudfrontLoggingBucket985C0FE8": { @@ -300,6 +301,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -364,7 +366,7 @@ "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", "Properties": { "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Identity for noargumentstestcloudfronts3CloudFrontDistributionOrigin1E8A0111C" + "Comment": "Identity for cfts3noargumentstestcloudfronts3CloudFrontDistributionOrigin1203032D1" } } }, @@ -386,7 +388,7 @@ } } ], - "TargetOriginId": "noargumentstestcloudfronts3CloudFrontDistributionOrigin1E8A0111C", + "TargetOriginId": "cfts3noargumentstestcloudfronts3CloudFrontDistributionOrigin1203032D1", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -409,7 +411,7 @@ "RegionalDomainName" ] }, - "Id": "noargumentstestcloudfronts3CloudFrontDistributionOrigin1E8A0111C", + "Id": "cfts3noargumentstestcloudfronts3CloudFrontDistributionOrigin1203032D1", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -467,7 +469,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-security-headers.expected.json similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-security-headers.expected.json index 495087c8b..fa33e7460 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-security-headers.expected.json @@ -212,6 +212,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -401,6 +402,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -465,7 +467,7 @@ "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", "Properties": { "CloudFrontOriginAccessIdentityConfig": { - "Comment": "Identity for nosecurityheaderstestcloudfronts3nosecurityheadersCloudFrontDistributionOrigin10FDD9A1E" + "Comment": "Identity for cfts3nosecurityheaderstestcloudfronts3nosecurityheadersCloudFrontDistributionOrigin1A0125E27" } } }, @@ -476,7 +478,7 @@ "DefaultCacheBehavior": { "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "TargetOriginId": "nosecurityheaderstestcloudfronts3nosecurityheadersCloudFrontDistributionOrigin10FDD9A1E", + "TargetOriginId": "cfts3nosecurityheaderstestcloudfronts3nosecurityheadersCloudFrontDistributionOrigin1A0125E27", "ViewerProtocolPolicy": "redirect-to-https" }, "DefaultRootObject": "index.html", @@ -499,7 +501,7 @@ "RegionalDomainName" ] }, - "Id": "nosecurityheaderstestcloudfronts3nosecurityheadersCloudFrontDistributionOrigin10FDD9A1E", + "Id": "cfts3nosecurityheaderstestcloudfronts3nosecurityheadersCloudFrontDistributionOrigin1A0125E27", "S3OriginConfig": { "OriginAccessIdentity": { "Fn::Join": [ @@ -557,7 +559,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.ts b/source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-security-headers.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.no-security-headers.ts rename to source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/integ.cfts3-no-security-headers.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.cogapilam-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.cogapilam-no-arguments.expected.json index d2b8fd4b5..9bd5d05e6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.cogapilam-no-arguments.expected.json @@ -237,7 +237,7 @@ } } }, - "testcognitoapigatewaylambdaLambdaRestApiproxyANYApiPermissionnoargumentstestcognitoapigatewaylambdaLambdaRestApi462B9E89ANYproxy65783C1A": { + "testcognitoapigatewaylambdaLambdaRestApiproxyANYApiPermissioncogapilamnoargumentstestcognitoapigatewaylambdaLambdaRestApi67DF35F8ANYproxyEED76CEA": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -278,7 +278,7 @@ } } }, - "testcognitoapigatewaylambdaLambdaRestApiproxyANYApiPermissionTestnoargumentstestcognitoapigatewaylambdaLambdaRestApi462B9E89ANYproxy8099796A": { + "testcognitoapigatewaylambdaLambdaRestApiproxyANYApiPermissionTestcogapilamnoargumentstestcognitoapigatewaylambdaLambdaRestApi67DF35F8ANYproxyD56E5373": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -358,7 +358,7 @@ } } }, - "testcognitoapigatewaylambdaLambdaRestApiANYApiPermissionnoargumentstestcognitoapigatewaylambdaLambdaRestApi462B9E89ANY9464EB5C": { + "testcognitoapigatewaylambdaLambdaRestApiANYApiPermissioncogapilamnoargumentstestcognitoapigatewaylambdaLambdaRestApi67DF35F8ANYF85B79BE": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -399,7 +399,7 @@ } } }, - "testcognitoapigatewaylambdaLambdaRestApiANYApiPermissionTestnoargumentstestcognitoapigatewaylambdaLambdaRestApi462B9E89ANYDB0151A4": { + "testcognitoapigatewaylambdaLambdaRestApiANYApiPermissionTestcogapilamnoargumentstestcognitoapigatewaylambdaLambdaRestApi67DF35F8ANYC215720C": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", diff --git a/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.cogapilam-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-cognito-apigateway-lambda/test/integ.cogapilam-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-deploy-with-vpc.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-deploy-with-vpc.expected.json index ff8d022f8..1c6d1bdfb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-deploy-with-vpc.expected.json @@ -136,7 +136,7 @@ "testddbstreamslambdaeskLambdaToElasticSearchReplaceDefaultSecurityGroupsecuritygroupB649DF04": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deploy-with-vpc/test-ddbstreams-lambda-esk/LambdaToElasticSearch/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/LambdaToElasticSearch/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -242,7 +242,7 @@ } } }, - "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionDynamoDBEventSourcedeploywithvpctestddbstreamslambdaeskDynamoDBStreamsToLambdaDynamoTableB7F9F75CD09B2055": { + "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionDynamoDBEventSourcedbslamelsdeploywithvpctestddbstreamslambdaeskDynamoDBStreamsToLambdaDynamoTable3450D24364E2F0CA": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "BatchSize": 100, @@ -359,7 +359,7 @@ "testddbstreamslambdaeskLambdaToElasticSearchUserPoolDomainA6C84014": { "Type": "AWS::Cognito::UserPoolDomain", "Properties": { - "Domain": "pooldomaintest-7c94db", + "Domain": "pooldomaintest-2342", "UserPoolId": { "Ref": "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPool97EA2952" } @@ -416,7 +416,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/pooldomaintest-7c94db/*" + ":domain/pooldomaintest-2342/*" ] ] } @@ -529,7 +529,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/domaintest-7c94db" + ":domain/domaintest-1234" ] ] } @@ -601,7 +601,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/domaintest-7c94db/*" + ":domain/domaintest-1234/*" ] ] } @@ -628,7 +628,7 @@ "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, - "DomainName": "domaintest-7c94db", + "DomainName": "domaintest-1234", "EBSOptions": { "EBSEnabled": true, "VolumeSize": 10 @@ -816,7 +816,7 @@ "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc" } ] } @@ -838,7 +838,7 @@ }, { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet1" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -852,7 +852,7 @@ "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet1" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -888,7 +888,7 @@ }, { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet2" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -902,7 +902,7 @@ "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet2" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -938,7 +938,7 @@ }, { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet3" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -952,7 +952,7 @@ "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet3" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -989,7 +989,7 @@ "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/FlowLog" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/FlowLog" } ] } @@ -1041,7 +1041,7 @@ "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/FlowLog" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/FlowLog" } ] }, @@ -1078,7 +1078,7 @@ "Tags": [ { "Key": "Name", - "Value": "deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/FlowLog" + "Value": "dbslamels-deploy-with-vpc/test-ddbstreams-lambda-esk/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-deploy-with-vpc.ts similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.ts rename to source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-deploy-with-vpc.ts index 7cd4f1bac..aeac16b60 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.deploy-with-vpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-deploy-with-vpc.ts @@ -28,8 +28,8 @@ const props: DynamoDBStreamsToLambdaToElasticSearchAndKibanaProps = { runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, - domainName: 'domaintest-7c94db', - cognitoDomainName: 'pooldomaintest-7c94db', + domainName: 'domaintest-1234', + cognitoDomainName: 'pooldomaintest-2342', deployVpc: true }; diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-no-arguments.expected.json index e1a92f7b7..55ed4697a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-no-arguments.expected.json @@ -177,7 +177,7 @@ } } }, - "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionDynamoDBEventSourcenoargumentstestddbstreamslambdaeskDynamoDBStreamsToLambdaDynamoTable6C5773679DA39002": { + "testddbstreamslambdaeskLambdaToElasticSearchLambdaFunctionDynamoDBEventSourcedbslamelsnoargumentstestddbstreamslambdaeskDynamoDBStreamsToLambdaDynamoTableE5DA3737A0F8E1D7": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "BatchSize": 100, @@ -289,7 +289,7 @@ "testddbstreamslambdaeskLambdaToElasticSearchUserPoolDomainA6C84014": { "Type": "AWS::Cognito::UserPoolDomain", "Properties": { - "Domain": "pooldomaintest-7c94db", + "Domain": "pooldomaintest-98eb", "UserPoolId": { "Ref": "testddbstreamslambdaeskLambdaToElasticSearchCognitoUserPool97EA2952" } @@ -346,7 +346,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/pooldomaintest-7c94db/*" + ":domain/pooldomaintest-98eb/*" ] ] } @@ -459,7 +459,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/domaintest-7c94db" + ":domain/domaintest-84ef" ] ] } @@ -531,7 +531,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/domaintest-7c94db/*" + ":domain/domaintest-84ef/*" ] ] } @@ -558,7 +558,7 @@ "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, - "DomainName": "domaintest-7c94db", + "DomainName": "domaintest-84ef", "EBSOptions": { "EBSEnabled": true, "VolumeSize": 10 diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-no-arguments.ts similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-no-arguments.ts index 490aaba9f..bc5a49757 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda-elasticsearch-kibana/test/integ.dbslamels-no-arguments.ts @@ -28,8 +28,8 @@ const props: DynamoDBStreamsToLambdaToElasticSearchAndKibanaProps = { runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler' }, - domainName: 'domaintest-7c94db', - cognitoDomainName: 'pooldomaintest-7c94db' + domainName: 'domaintest-84ef', + cognitoDomainName: 'pooldomaintest-98eb' }; new DynamoDBStreamsToLambdaToElasticSearchAndKibana(stack, 'test-ddbstreams-lambda-esk', props); diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-existing-table.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.expected.json rename to source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-existing-table.expected.json index b89b0b08d..7f9f9b0b6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-existing-table.expected.json @@ -3,19 +3,19 @@ "mytable0FC8E698": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, @@ -160,18 +160,18 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testdynamodbstreamslambdaLambdaFunctionServiceRole17CB5CA1", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testdynamodbstreamslambdaLambdaFunctionServiceRole17CB5CA1", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -200,12 +200,9 @@ } } }, - "testdynamodbstreamslambdaLambdaFunctionDynamoDBEventSourceexistingtablemytable8CDC3452876951B6": { + "testdynamodbstreamslambdaLambdaFunctionDynamoDBEventSourcedbslamexistingtablemytable00A85A16A55832C3": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testdynamodbstreamslambdaLambdaFunctionE18EC5EF" - }, "BatchSize": 100, "BisectBatchOnFunctionError": true, "DestinationConfig": { @@ -224,6 +221,9 @@ "StreamArn" ] }, + "FunctionName": { + "Ref": "testdynamodbstreamslambdaLambdaFunctionE18EC5EF" + }, "MaximumRecordAgeInSeconds": 86400, "MaximumRetryAttempts": 500, "StartingPosition": "TRIM_HORIZON" diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-existing-table.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.existing-table.ts rename to source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-existing-table.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-no-arguments.expected.json index ae6f93c0d..c9e4a9c14 100644 --- a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-no-arguments.expected.json @@ -131,18 +131,18 @@ }, "S3Key": "0c3255e93ffe7a906c7422e9f0e9cc4c7fd86ee996ee3bb302e2f134b38463c8.zip" }, - "Role": { - "Fn::GetAtt": [ - "testdynamodbstreamslambdaLambdaFunctionServiceRole17CB5CA1", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1" } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testdynamodbstreamslambdaLambdaFunctionServiceRole17CB5CA1", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -171,12 +171,9 @@ } } }, - "testdynamodbstreamslambdaLambdaFunctionDynamoDBEventSourcenoargumentstestdynamodbstreamslambdaDynamoTableAFF0DC9B4ED090BE": { + "testdynamodbstreamslambdaLambdaFunctionDynamoDBEventSourcedbslamnoargumentstestdynamodbstreamslambdaDynamoTable052A32715F190F5F": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { - "FunctionName": { - "Ref": "testdynamodbstreamslambdaLambdaFunctionE18EC5EF" - }, "BatchSize": 100, "BisectBatchOnFunctionError": true, "DestinationConfig": { @@ -195,6 +192,9 @@ "StreamArn" ] }, + "FunctionName": { + "Ref": "testdynamodbstreamslambdaLambdaFunctionE18EC5EF" + }, "MaximumRecordAgeInSeconds": 86400, "MaximumRetryAttempts": 5, "StartingPosition": "TRIM_HORIZON" @@ -203,19 +203,19 @@ "testdynamodbstreamslambdaDynamoTable64210BF7": { "Type": "AWS::DynamoDB::Table", "Properties": { - "KeySchema": [ + "AttributeDefinitions": [ { "AttributeName": "id", - "KeyType": "HASH" + "AttributeType": "S" } ], - "AttributeDefinitions": [ + "BillingMode": "PAY_PER_REQUEST", + "KeySchema": [ { "AttributeName": "id", - "AttributeType": "S" + "KeyType": "HASH" } ], - "BillingMode": "PAY_PER_REQUEST", "PointInTimeRecoverySpecification": { "PointInTimeRecoveryEnabled": true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/integ.dbslam-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json similarity index 79% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json index b9f4c55de..5db0e63f4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json @@ -19,6 +19,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -78,6 +84,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -119,6 +164,25 @@ } } }, + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketAutoDeleteObjectsCustomResourceB808B0FC": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C" + } + }, + "DependsOn": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketPolicyCF0D71BD" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF": { "Type": "AWS::S3::Bucket", "Properties": { @@ -341,7 +405,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosecustomLoggingBuckoses3KinesisFirehoseToS38ABD91BB", + "DeliveryStreamName": "KinesisFirehoseevtfhss3customLogoses3KinesisFirehoseToS3E4F82781", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -466,6 +530,64 @@ } ] } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts index ef5852a3f..f4bf4df6e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts @@ -32,6 +32,7 @@ new EventbridgeToKinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { }, loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, bucketName: 'custom-logging-bucket', encryption: s3.BucketEncryption.S3_MANAGED, versioned: true diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json index 4cc9bd8bf..3c281d102 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json @@ -234,7 +234,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseeventbridgekinesioses3KinesisFirehoseToS316415EBE", + "DeliveryStreamName": "KinesisFirehoseevtfhss3eventbridoses3KinesisFirehoseToS377F40344", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-existing-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-new-eventbus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.expected.json index 674560545..b2641aa1a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-new-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.expected.json @@ -228,7 +228,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseeventbridgekinesioses3KinesisFirehoseToS3BB825337", + "DeliveryStreamName": "KinesisFirehoseevtfhss3eventbridoses3KinesisFirehoseToS3980BC114", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-new-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.expected.json index c5bfb2b37..054f3cf12 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.expected.json @@ -341,7 +341,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseeventbridgekinesioses3KinesisFirehoseToS3EFE1A339", + "DeliveryStreamName": "KinesisFirehoseevtfhss3eventbridoses3KinesisFirehoseToS3BF3B2749", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.eventbridge-kinesisfirehose-s3-no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.expected.json index 8a3494f26..59941168d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.expected.json @@ -53,6 +53,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -178,7 +179,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "350185a1069fa20a23a583e20c77f6844218bd73097902362dc94f1a108f5d89.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -447,7 +448,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseexistingLoggingBuoses3KinesisFirehoseToS3375399AD", + "DeliveryStreamName": "KinesisFirehoseevtfhss3existingLoses3KinesisFirehoseToS3EAD9E0AB", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.existingLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing-eventbus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.expected.json index 8ac3c17b4..093123e2b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.expected.json @@ -100,9 +100,9 @@ "testeventbridgekinesisstreamexistingKinesisStreamGetRecordsIteratorAgeAlarmA1800C3D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -113,9 +113,9 @@ "testeventbridgekinesisstreamexistingKinesisStreamReadProvisionedThroughputExceededAlarm078FEB59": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing.expected.json index 7b52073cf..7f68bd995 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing.expected.json @@ -87,9 +87,9 @@ "testeventbridgekinesisstreamexistingKinesisStreamGetRecordsIteratorAgeAlarmA1800C3D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -100,9 +100,9 @@ "testeventbridgekinesisstreamexistingKinesisStreamReadProvisionedThroughputExceededAlarm078FEB59": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-existing.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-new-eventbus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.expected.json index 188654d1b..37362f5ee 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-new-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.expected.json @@ -100,9 +100,9 @@ "testeventbridgekinesisstreamKinesisStreamGetRecordsIteratorAgeAlarm5FD9545D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -113,9 +113,9 @@ "testeventbridgekinesisstreamKinesisStreamReadProvisionedThroughputExceededAlarm600B4281": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-new-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-no-arguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-no-arguments.expected.json index 62961abd1..1048fccdf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-no-arguments.expected.json @@ -87,9 +87,9 @@ "testeventbridgekinesisstreamKinesisStreamGetRecordsIteratorAgeAlarm5FD9545D": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -100,9 +100,9 @@ "testeventbridgekinesisstreamKinesisStreamReadProvisionedThroughputExceededAlarm600B4281": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.eventbridge-kinesisstreams-no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-existing-eventbus.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-existing-eventbus.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-existing-eventbus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-existing-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-existing-eventbus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-new-eventbus.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-new-eventbus.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-new-eventbus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-new-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-new-eventbus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-no-argument.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-no-argument.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-no-argument.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.eventbridge-no-argument.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-lambda/test/integ.evtlam-eventbridge-no-argument.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.exist-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.exist-bus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.expected.json index 60a6796d3..ea66e7bec 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.exist-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.expected.json @@ -182,7 +182,7 @@ "Fn::Join": [ "", [ - "exist-bustest-construct-", + "evtsns-exist-test-construct-", { "Fn::Select": [ 2, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.exist-bus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.exist-bus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-long-stack-name.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-long-stack-name.expected.json index 2ead5278a..5ba9f272e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-long-stack-name.expected.json @@ -169,7 +169,7 @@ "Fn::Join": [ "", [ - "longstacknametest-construct-", + "evtsnslongstatest-construct-", { "Fn::Select": [ 2, @@ -359,7 +359,7 @@ "Fn::Join": [ "", [ - "longstacknamecond-construct-", + "evtsnslongstacond-construct-", { "Fn::Select": [ 2, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-long-stack-name.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.long-stack-name.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-long-stack-name.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.new-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.new-bus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.expected.json index 1a5cd3a19..a1ef80ba0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.new-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.expected.json @@ -182,7 +182,7 @@ "Fn::Join": [ "", [ - "new-bustest-construct-", + "evtsns-new-butest-construct-", { "Fn::Select": [ 2, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.new-bus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.new-bus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.no-arg.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-no-arg.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.no-arg.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-no-arg.expected.json index 15096fe48..12b2ac362 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.no-arg.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-no-arg.expected.json @@ -169,7 +169,7 @@ "Fn::Join": [ "", [ - "no-argtest-construct-", + "evtsns-no-argtest-construct-", { "Fn::Select": [ 2, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.no-arg.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-no-arg.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.no-arg.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-no-arg.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-second-long-stack-name.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-second-long-stack-name.expected.json index 61fcb4f5b..09044192c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-second-long-stack-name.expected.json @@ -169,7 +169,7 @@ "Fn::Join": [ "", [ - "secondlongstatest-construct-", + "evtsnssecondltest-construct-", { "Fn::Select": [ 2, @@ -359,7 +359,7 @@ "Fn::Join": [ "", [ - "secondlongstacond-construct-", + "evtsnssecondlcond-construct-", { "Fn::Select": [ 2, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-second-long-stack-name.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.second-long-stack-name.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-second-long-stack-name.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-bus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.expected.json index ed59bf5c3..b63928b31 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.expected.json @@ -3,6 +3,7 @@ "MyKey6AB29FA6": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -43,8 +44,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-bus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-bus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-queue.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-queue.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-queue.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-queue.expected.json index b888ac1b9..f76a2f2cb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-queue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-queue.expected.json @@ -3,6 +3,7 @@ "MyKey6AB29FA6": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -43,8 +44,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-queue.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-queue.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.exist-queue.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-queue.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.new-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.new-bus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.expected.json index 3b3c5a47e..0abe9486a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.new-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.expected.json @@ -82,6 +82,7 @@ "constructEncryptionKey9426451E": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -122,8 +123,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.new-bus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.new-bus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.no-arg.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-no-arg.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.no-arg.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-no-arg.expected.json index 47c71c258..63f8ecca2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.no-arg.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-no-arg.expected.json @@ -82,6 +82,7 @@ "constructEncryptionKey9426451E": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -122,8 +123,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.no-arg.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-no-arg.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.no-arg.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-no-arg.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-existing-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-new-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-no-argument.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-no-argument.expected.json index 2511b0adc..61ce72236 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-no-argument.expected.json @@ -7,7 +7,7 @@ "Fn::Join": [ "", [ - "/aws/vendedlogs/states/constructs/eventbridge-stepfunctions-no-argumenttest-eventbridge-stepfunctions-constructStateMachineLog-", + "/aws/vendedlogs/states/constructs/evtstp-eventbridge-stepfunctions-no-argumenttest-eventbridge-stepfunctions-constructStateMachineLog-", { "Fn::Select": [ 2, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-no-argument.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-no-argument.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-no-argument.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.eventbridge-stepfunctions-with-lambda.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-existing-resources.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-existing-resources.expected.json index d02e765af..8e4a0dfe9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-existing-resources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farddb-existing-resources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farddb-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farddb-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farddb-existing-resources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farddb-existing-resources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farddb-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farddb-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farddb-existing-resources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farddb-existing-resources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farddb-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farddb-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farddb-existing-resources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farddb-existing-resources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farddb-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farddb-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farddb-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farddb-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farddb-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farddb-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farddb-existing-resources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farddb-existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farddb-existing-resources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farddb-existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRAPIsecuritygroup78294485", + "farddbexistingresourcesECRAPIsecuritygroup2D1C2961", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRDKRsecuritygroup598BA37E", + "farddbexistingresourcesECRDKRsecuritygroup11EC6157", "GroupId" ] } @@ -838,10 +838,10 @@ "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" }, - "existingresourcesECRAPIsecuritygroup78294485": { + "farddbexistingresourcesECRAPIsecuritygroup2D1C2961": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_API-security-group", + "GroupDescription": "farddb-existing-resources/farddb-existing-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -896,10 +896,10 @@ } } }, - "existingresourcesECRDKRsecuritygroup598BA37E": { + "farddbexistingresourcesECRDKRsecuritygroup11EC6157": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_DKR-security-group", + "GroupDescription": "farddb-existing-resources/farddb-existing-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1053,7 +1053,7 @@ } ], "Cpu": "256", - "Family": "existingresourcestesttaskdef88B214A2", + "Family": "farddbexistingresourcestesttaskdef48323A94", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-existing-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.existing-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-existing-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-new-resources.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.new-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-new-resources.expected.json index 3b243e331..75dd27a42 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-new-resources.expected.json @@ -37,7 +37,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farddb-new-resources/Vpc" } ] } @@ -59,7 +59,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farddb-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -83,7 +83,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farddb-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -124,7 +124,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farddb-new-resources/Vpc/PublicSubnet1" } ] } @@ -144,7 +144,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farddb-new-resources/Vpc/PublicSubnet1" } ] }, @@ -170,7 +170,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farddb-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -194,7 +194,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farddb-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -235,7 +235,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farddb-new-resources/Vpc/PublicSubnet2" } ] } @@ -255,7 +255,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farddb-new-resources/Vpc/PublicSubnet2" } ] }, @@ -281,7 +281,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farddb-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -305,7 +305,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farddb-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -346,7 +346,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farddb-new-resources/Vpc/PublicSubnet3" } ] } @@ -366,7 +366,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farddb-new-resources/Vpc/PublicSubnet3" } ] }, @@ -392,7 +392,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farddb-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -406,7 +406,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farddb-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -454,7 +454,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farddb-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -468,7 +468,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farddb-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -516,7 +516,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farddb-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -530,7 +530,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farddb-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -567,7 +567,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farddb-new-resources/Vpc" } ] } @@ -601,7 +601,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farddb-new-resources/Vpc/FlowLog" } ] } @@ -653,7 +653,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farddb-new-resources/Vpc/FlowLog" } ] }, @@ -690,7 +690,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farddb-new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -744,7 +744,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRAPIsecuritygroupE52BAE3F", + "farddbnewresourcesECRAPIsecuritygroup6FC91C04", "GroupId" ] } @@ -774,7 +774,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRDKRsecuritygroupBA34F94F", + "farddbnewresourcesECRDKRsecuritygroup0930364A", "GroupId" ] } @@ -838,10 +838,10 @@ } } }, - "newresourcesECRAPIsecuritygroupE52BAE3F": { + "farddbnewresourcesECRAPIsecuritygroup6FC91C04": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_API-security-group", + "GroupDescription": "farddb-new-resources/farddb-new-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -896,10 +896,10 @@ } } }, - "newresourcesECRDKRsecuritygroupBA34F94F": { + "farddbnewresourcesECRDKRsecuritygroup0930364A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_DKR-security-group", + "GroupDescription": "farddb-new-resources/farddb-new-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1053,7 +1053,7 @@ } ], "Cpu": "256", - "Family": "newresourcestestconstructtaskdefE4616A0D", + "Family": "farddbnewresourcestestconstructtaskdefF4399DA9", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-new-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.new-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-dynamodb/test/integ.farddb-new-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.expected.json index befd1b89b..00695cbad 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farevt-existing-resources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farevt-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farevt-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farevt-existing-resources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farevt-existing-resources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farevt-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farevt-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farevt-existing-resources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farevt-existing-resources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farevt-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farevt-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farevt-existing-resources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farevt-existing-resources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farevt-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farevt-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farevt-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farevt-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farevt-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farevt-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farevt-existing-resources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farevt-existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farevt-existing-resources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farevt-existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRAPIsecuritygroup78294485", + "farevtexistingresourcesECRAPIsecuritygroup1075412D", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRDKRsecuritygroup598BA37E", + "farevtexistingresourcesECRDKRsecuritygroup19D33D2A", "GroupId" ] } @@ -778,7 +778,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesCLOUDWATCHEVENTSsecuritygroupD95BA196", + "farevtexistingresourcesCLOUDWATCHEVENTSsecuritygroup33E6AE58", "GroupId" ] } @@ -801,10 +801,10 @@ } } }, - "existingresourcesECRAPIsecuritygroup78294485": { + "farevtexistingresourcesECRAPIsecuritygroup1075412D": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_API-security-group", + "GroupDescription": "farevt-existing-resources/farevt-existing-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -859,10 +859,10 @@ } } }, - "existingresourcesECRDKRsecuritygroup598BA37E": { + "farevtexistingresourcesECRDKRsecuritygroup19D33D2A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_DKR-security-group", + "GroupDescription": "farevt-existing-resources/farevt-existing-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -989,7 +989,7 @@ } ], "Cpu": "256", - "Family": "existingresourcestesttaskdef88B214A2", + "Family": "farevtexistingresourcestesttaskdefF2E3720F", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1091,10 +1091,10 @@ "Name": "test" } }, - "existingresourcesCLOUDWATCHEVENTSsecuritygroupD95BA196": { + "farevtexistingresourcesCLOUDWATCHEVENTSsecuritygroup33E6AE58": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-CLOUDWATCH_EVENTS-security-group", + "GroupDescription": "farevt-existing-resources/farevt-existing-resources-CLOUDWATCH_EVENTS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.existing-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-new-resources.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.new-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-new-resources.expected.json index 15a6c4295..2290bd6aa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-new-resources.expected.json @@ -17,7 +17,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farevt-new-resources/Vpc" } ] } @@ -39,7 +39,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farevt-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -63,7 +63,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farevt-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -104,7 +104,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farevt-new-resources/Vpc/PublicSubnet1" } ] } @@ -124,7 +124,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farevt-new-resources/Vpc/PublicSubnet1" } ] }, @@ -150,7 +150,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farevt-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -174,7 +174,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farevt-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -215,7 +215,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farevt-new-resources/Vpc/PublicSubnet2" } ] } @@ -235,7 +235,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farevt-new-resources/Vpc/PublicSubnet2" } ] }, @@ -261,7 +261,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farevt-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -285,7 +285,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farevt-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -326,7 +326,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farevt-new-resources/Vpc/PublicSubnet3" } ] } @@ -346,7 +346,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farevt-new-resources/Vpc/PublicSubnet3" } ] }, @@ -372,7 +372,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farevt-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -386,7 +386,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farevt-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -434,7 +434,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farevt-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -448,7 +448,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farevt-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -496,7 +496,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farevt-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -510,7 +510,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farevt-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -547,7 +547,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farevt-new-resources/Vpc" } ] } @@ -581,7 +581,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farevt-new-resources/Vpc/FlowLog" } ] } @@ -633,7 +633,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farevt-new-resources/Vpc/FlowLog" } ] }, @@ -670,7 +670,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farevt-new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -683,7 +683,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesCLOUDWATCHEVENTSsecuritygroupC0F12F92", + "farevtnewresourcesCLOUDWATCHEVENTSsecuritygroup07F35AB2", "GroupId" ] } @@ -713,7 +713,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRAPIsecuritygroupE52BAE3F", + "farevtnewresourcesECRAPIsecuritygroup5499E098", "GroupId" ] } @@ -743,7 +743,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRDKRsecuritygroupBA34F94F", + "farevtnewresourcesECRDKRsecuritygroupC8F4AFAB", "GroupId" ] } @@ -807,10 +807,10 @@ } } }, - "newresourcesCLOUDWATCHEVENTSsecuritygroupC0F12F92": { + "farevtnewresourcesCLOUDWATCHEVENTSsecuritygroup07F35AB2": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-CLOUDWATCH_EVENTS-security-group", + "GroupDescription": "farevt-new-resources/farevt-new-resources-CLOUDWATCH_EVENTS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -865,10 +865,10 @@ } } }, - "newresourcesECRAPIsecuritygroupE52BAE3F": { + "farevtnewresourcesECRAPIsecuritygroup5499E098": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_API-security-group", + "GroupDescription": "farevt-new-resources/farevt-new-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -923,10 +923,10 @@ } } }, - "newresourcesECRDKRsecuritygroupBA34F94F": { + "farevtnewresourcesECRDKRsecuritygroupC8F4AFAB": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_DKR-security-group", + "GroupDescription": "farevt-new-resources/farevt-new-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1053,7 +1053,7 @@ } ], "Cpu": "256", - "Family": "newresourcestestconstructtaskdefE4616A0D", + "Family": "farevtnewresourcestestconstructtaskdef0A14010C", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-new-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.new-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-new-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingFargateService.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingFargateService.expected.json index 5f1f86256..3986dd0ff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingFargateService.expected.json @@ -10,7 +10,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "farfhs-existingFargateService/Vpc" } ] } @@ -32,7 +32,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet1" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet1" } ], "VpcId": { @@ -56,7 +56,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet1" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet1" } ], "VpcId": { @@ -97,7 +97,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet1" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet1" } ] } @@ -117,7 +117,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet1" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet1" } ] }, @@ -143,7 +143,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet2" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet2" } ], "VpcId": { @@ -167,7 +167,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet2" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet2" } ], "VpcId": { @@ -208,7 +208,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet2" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet2" } ] } @@ -228,7 +228,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet2" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet2" } ] }, @@ -254,7 +254,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet3" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet3" } ], "VpcId": { @@ -278,7 +278,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet3" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet3" } ], "VpcId": { @@ -319,7 +319,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet3" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet3" } ] } @@ -339,7 +339,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet3" + "Value": "farfhs-existingFargateService/Vpc/PublicSubnet3" } ] }, @@ -365,7 +365,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet1" + "Value": "farfhs-existingFargateService/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -379,7 +379,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet1" + "Value": "farfhs-existingFargateService/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -427,7 +427,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet2" + "Value": "farfhs-existingFargateService/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -441,7 +441,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet2" + "Value": "farfhs-existingFargateService/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -489,7 +489,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet3" + "Value": "farfhs-existingFargateService/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -503,7 +503,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet3" + "Value": "farfhs-existingFargateService/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "farfhs-existingFargateService/Vpc" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/FlowLog" + "Value": "farfhs-existingFargateService/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/FlowLog" + "Value": "farfhs-existingFargateService/Vpc/FlowLog" } ] }, @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/FlowLog" + "Value": "farfhs-existingFargateService/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -676,7 +676,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingFargateServiceECRAPIsecuritygroup5EE2643E", + "farfhsexistingFargateServiceECRAPIsecuritygroupA97DCBC0", "GroupId" ] } @@ -717,7 +717,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingFargateServiceECRDKRsecuritygroup41F182BE", + "farfhsexistingFargateServiceECRDKRsecuritygroupE5EBBFB7", "GroupId" ] } @@ -799,7 +799,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingFargateServiceKINESISFIREHOSEsecuritygroup9CDC51DB", + "farfhsexistingFargateServiceKINESISFIREHOSEsecuritygroup7DCAD91B", "GroupId" ] } @@ -918,6 +918,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -1107,6 +1108,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -1299,7 +1301,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseexistingFargateServicedestinationfirehose0C07B822", + "DeliveryStreamName": "KinesisFirehosefarfhsexistingFarrvicedestinationfirehoseB43CCB26", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -1383,7 +1385,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1430,10 +1432,10 @@ } } }, - "existingFargateServiceECRAPIsecuritygroup5EE2643E": { + "farfhsexistingFargateServiceECRAPIsecuritygroupA97DCBC0": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingFargateService/existingFargateService-ECR_API-security-group", + "GroupDescription": "farfhs-existingFargateService/farfhs-existingFargateService-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1488,10 +1490,10 @@ } } }, - "existingFargateServiceECRDKRsecuritygroup41F182BE": { + "farfhsexistingFargateServiceECRDKRsecuritygroupE5EBBFB7": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingFargateService/existingFargateService-ECR_DKR-security-group", + "GroupDescription": "farfhs-existingFargateService/farfhs-existingFargateService-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1605,7 +1607,7 @@ "Environment": [ { "Name": "FIREHOSE_DELIVERYSTREAM_NAME", - "Value": "KinesisFirehoseexistingFargateServicedestinationfirehose0C07B822" + "Value": "KinesisFirehosefarfhsexistingFarrvicedestinationfirehoseB43CCB26" } ], "Essential": true, @@ -1621,7 +1623,7 @@ } ], "Cpu": "256", - "Family": "existingFargateServicetesttaskdef55189A31", + "Family": "farfhsexistingFargateServicetesttaskdefCE4EB283", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1717,10 +1719,10 @@ "testtaskdefTaskRoleB2DEF113" ] }, - "existingFargateServiceKINESISFIREHOSEsecuritygroup9CDC51DB": { + "farfhsexistingFargateServiceKINESISFIREHOSEsecuritygroup7DCAD91B": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingFargateService/existingFargateService-KINESIS_FIREHOSE-security-group", + "GroupDescription": "farfhs-existingFargateService/farfhs-existingFargateService-KINESIS_FIREHOSE-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingFargateService.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingFargateService.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingFargateService.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingVpc.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingVpc.expected.json index dd8a62f26..52ff7192a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingVpc.expected.json @@ -10,7 +10,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "farfhs-existingVpc/Vpc" } ] } @@ -32,7 +32,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -56,7 +56,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -97,7 +97,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet1" } ] } @@ -117,7 +117,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet1" } ] }, @@ -143,7 +143,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -167,7 +167,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -208,7 +208,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet2" } ] } @@ -228,7 +228,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet2" } ] }, @@ -254,7 +254,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -278,7 +278,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -319,7 +319,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet3" } ] } @@ -339,7 +339,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "farfhs-existingVpc/Vpc/PublicSubnet3" } ] }, @@ -365,7 +365,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet1" + "Value": "farfhs-existingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -379,7 +379,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet1" + "Value": "farfhs-existingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -427,7 +427,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet2" + "Value": "farfhs-existingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -441,7 +441,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet2" + "Value": "farfhs-existingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -489,7 +489,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet3" + "Value": "farfhs-existingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -503,7 +503,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet3" + "Value": "farfhs-existingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "farfhs-existingVpc/Vpc" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/FlowLog" + "Value": "farfhs-existingVpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/FlowLog" + "Value": "farfhs-existingVpc/Vpc/FlowLog" } ] }, @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/FlowLog" + "Value": "farfhs-existingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -676,7 +676,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingVpcKINESISFIREHOSEsecuritygroupCC06079B", + "farfhsexistingVpcKINESISFIREHOSEsecuritygroup14103283", "GroupId" ] } @@ -717,7 +717,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingVpcECRAPIsecuritygroupB3E4A376", + "farfhsexistingVpcECRAPIsecuritygroup51B9740B", "GroupId" ] } @@ -758,7 +758,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingVpcECRDKRsecuritygroup0500FAE6", + "farfhsexistingVpcECRDKRsecuritygroup0940D84A", "GroupId" ] } @@ -918,6 +918,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -1107,6 +1108,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -1299,7 +1301,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseexistingVpcdestinationfirehose4FF537ED", + "DeliveryStreamName": "KinesisFirehosefarfhsexistingVpcdestinationfirehose00DD7D12", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -1383,7 +1385,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -1430,10 +1432,10 @@ } } }, - "existingVpcKINESISFIREHOSEsecuritygroupCC06079B": { + "farfhsexistingVpcKINESISFIREHOSEsecuritygroup14103283": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingVpc/existingVpc-KINESIS_FIREHOSE-security-group", + "GroupDescription": "farfhs-existingVpc/farfhs-existingVpc-KINESIS_FIREHOSE-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1488,10 +1490,10 @@ } } }, - "existingVpcECRAPIsecuritygroupB3E4A376": { + "farfhsexistingVpcECRAPIsecuritygroup51B9740B": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingVpc/existingVpc-ECR_API-security-group", + "GroupDescription": "farfhs-existingVpc/farfhs-existingVpc-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1546,10 +1548,10 @@ } } }, - "existingVpcECRDKRsecuritygroup0500FAE6": { + "farfhsexistingVpcECRDKRsecuritygroup0940D84A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingVpc/existingVpc-ECR_DKR-security-group", + "GroupDescription": "farfhs-existingVpc/farfhs-existingVpc-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1663,7 +1665,7 @@ "Environment": [ { "Name": "FIREHOSE_DELIVERYSTREAM_NAME", - "Value": "KinesisFirehoseexistingVpcdestinationfirehose4FF537ED" + "Value": "KinesisFirehosefarfhsexistingVpcdestinationfirehose00DD7D12" } ], "Essential": true, @@ -1679,7 +1681,7 @@ } ], "Cpu": "256", - "Family": "existingVpctestfargatekinesisstreamstaskdefAAC2A3A2", + "Family": "farfhsexistingVpctestfargatekinesisstreamstaskdefD49AA981", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.existingVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-existingVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-fargateServiceFromProps.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-fargateServiceFromProps.expected.json index 45d796abc..acf544bc2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-fargateServiceFromProps.expected.json @@ -85,6 +85,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -274,6 +275,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -466,7 +468,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosefargateServiceFroPropsdestinationfirehose67832675", + "DeliveryStreamName": "KinesisFirehosefarfhsfargateServPropsdestinationfirehose9D4304E8", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -550,7 +552,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -607,7 +609,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "farfhs-fargateServiceFromProps/Vpc" } ] } @@ -629,7 +631,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet1" } ], "VpcId": { @@ -653,7 +655,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet1" } ], "VpcId": { @@ -694,7 +696,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet1" } ] } @@ -714,7 +716,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet1" } ] }, @@ -740,7 +742,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet2" } ], "VpcId": { @@ -764,7 +766,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet2" } ], "VpcId": { @@ -805,7 +807,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet2" } ] } @@ -825,7 +827,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet2" } ] }, @@ -851,7 +853,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet3" } ], "VpcId": { @@ -875,7 +877,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet3" } ], "VpcId": { @@ -916,7 +918,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet3" } ] } @@ -936,7 +938,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" + "Value": "farfhs-fargateServiceFromProps/Vpc/PublicSubnet3" } ] }, @@ -962,7 +964,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet1" + "Value": "farfhs-fargateServiceFromProps/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -976,7 +978,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet1" + "Value": "farfhs-fargateServiceFromProps/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -1024,7 +1026,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet2" + "Value": "farfhs-fargateServiceFromProps/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1038,7 +1040,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet2" + "Value": "farfhs-fargateServiceFromProps/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1086,7 +1088,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet3" + "Value": "farfhs-fargateServiceFromProps/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1100,7 +1102,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet3" + "Value": "farfhs-fargateServiceFromProps/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1137,7 +1139,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "farfhs-fargateServiceFromProps/Vpc" } ] } @@ -1171,7 +1173,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/FlowLog" + "Value": "farfhs-fargateServiceFromProps/Vpc/FlowLog" } ] } @@ -1223,7 +1225,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/FlowLog" + "Value": "farfhs-fargateServiceFromProps/Vpc/FlowLog" } ] }, @@ -1260,7 +1262,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/FlowLog" + "Value": "farfhs-fargateServiceFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1273,7 +1275,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "fargateServiceFromPropsKINESISFIREHOSEsecuritygroupC0011304", + "farfhsfargateServiceFromPropsKINESISFIREHOSEsecuritygroupE3B668C5", "GroupId" ] } @@ -1314,7 +1316,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "fargateServiceFromPropsECRAPIsecuritygroup5784F80B", + "farfhsfargateServiceFromPropsECRAPIsecuritygroupA1B3AD3C", "GroupId" ] } @@ -1355,7 +1357,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "fargateServiceFromPropsECRDKRsecuritygroup9E1C301F", + "farfhsfargateServiceFromPropsECRDKRsecuritygroup92D10A76", "GroupId" ] } @@ -1430,10 +1432,10 @@ } } }, - "fargateServiceFromPropsKINESISFIREHOSEsecuritygroupC0011304": { + "farfhsfargateServiceFromPropsKINESISFIREHOSEsecuritygroupE3B668C5": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "fargateServiceFromProps/fargateServiceFromProps-KINESIS_FIREHOSE-security-group", + "GroupDescription": "farfhs-fargateServiceFromProps/farfhs-fargateServiceFromProps-KINESIS_FIREHOSE-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1488,10 +1490,10 @@ } } }, - "fargateServiceFromPropsECRAPIsecuritygroup5784F80B": { + "farfhsfargateServiceFromPropsECRAPIsecuritygroupA1B3AD3C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "fargateServiceFromProps/fargateServiceFromProps-ECR_API-security-group", + "GroupDescription": "farfhs-fargateServiceFromProps/farfhs-fargateServiceFromProps-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1546,10 +1548,10 @@ } } }, - "fargateServiceFromPropsECRDKRsecuritygroup9E1C301F": { + "farfhsfargateServiceFromPropsECRDKRsecuritygroup92D10A76": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "fargateServiceFromProps/fargateServiceFromProps-ECR_DKR-security-group", + "GroupDescription": "farfhs-fargateServiceFromProps/farfhs-fargateServiceFromProps-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1663,7 +1665,7 @@ "Environment": [ { "Name": "FIREHOSE_DELIVERYSTREAM_NAME", - "Value": "KinesisFirehosefargateServiceFroPropsdestinationfirehose67832675" + "Value": "KinesisFirehosefarfhsfargateServPropsdestinationfirehose9D4304E8" } ], "Essential": true, @@ -1679,7 +1681,7 @@ } ], "Cpu": "256", - "Family": "fargateServiceFromPropstestfargatekinesisstreamstaskdef00ED69EC", + "Family": "farfhsfargateServiceFromPropstestfargatekinesisstreamstaskdef6EEE5F31", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-fargateServiceFromProps.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.fargateServiceFromProps.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-fargateServiceFromProps.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-noArguments.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-noArguments.expected.json index a9acca727..0eec2fe3a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-noArguments.expected.json @@ -85,6 +85,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -274,6 +275,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -466,7 +468,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosenoArgumentsdestinationfirehose7F26EC12", + "DeliveryStreamName": "KinesisFirehosefarfhsnoArgumentsdestinationfirehose6033CCDA", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -546,7 +548,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -603,7 +605,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "farfhs-noArguments/Vpc" } ] } @@ -625,7 +627,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet1" + "Value": "farfhs-noArguments/Vpc/PublicSubnet1" } ], "VpcId": { @@ -649,7 +651,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet1" + "Value": "farfhs-noArguments/Vpc/PublicSubnet1" } ], "VpcId": { @@ -690,7 +692,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet1" + "Value": "farfhs-noArguments/Vpc/PublicSubnet1" } ] } @@ -710,7 +712,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet1" + "Value": "farfhs-noArguments/Vpc/PublicSubnet1" } ] }, @@ -736,7 +738,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet2" + "Value": "farfhs-noArguments/Vpc/PublicSubnet2" } ], "VpcId": { @@ -760,7 +762,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet2" + "Value": "farfhs-noArguments/Vpc/PublicSubnet2" } ], "VpcId": { @@ -801,7 +803,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet2" + "Value": "farfhs-noArguments/Vpc/PublicSubnet2" } ] } @@ -821,7 +823,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet2" + "Value": "farfhs-noArguments/Vpc/PublicSubnet2" } ] }, @@ -847,7 +849,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet3" + "Value": "farfhs-noArguments/Vpc/PublicSubnet3" } ], "VpcId": { @@ -871,7 +873,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet3" + "Value": "farfhs-noArguments/Vpc/PublicSubnet3" } ], "VpcId": { @@ -912,7 +914,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet3" + "Value": "farfhs-noArguments/Vpc/PublicSubnet3" } ] } @@ -932,7 +934,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet3" + "Value": "farfhs-noArguments/Vpc/PublicSubnet3" } ] }, @@ -958,7 +960,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet1" + "Value": "farfhs-noArguments/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -972,7 +974,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet1" + "Value": "farfhs-noArguments/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -1020,7 +1022,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet2" + "Value": "farfhs-noArguments/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1034,7 +1036,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet2" + "Value": "farfhs-noArguments/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1082,7 +1084,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet3" + "Value": "farfhs-noArguments/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1096,7 +1098,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet3" + "Value": "farfhs-noArguments/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1133,7 +1135,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "farfhs-noArguments/Vpc" } ] } @@ -1167,7 +1169,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/FlowLog" + "Value": "farfhs-noArguments/Vpc/FlowLog" } ] } @@ -1219,7 +1221,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/FlowLog" + "Value": "farfhs-noArguments/Vpc/FlowLog" } ] }, @@ -1256,7 +1258,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/FlowLog" + "Value": "farfhs-noArguments/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1269,7 +1271,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "noArgumentsKINESISFIREHOSEsecuritygroupBE0C0999", + "farfhsnoArgumentsKINESISFIREHOSEsecuritygroup0EB96AE5", "GroupId" ] } @@ -1299,7 +1301,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "noArgumentsECRAPIsecuritygroup70B67825", + "farfhsnoArgumentsECRAPIsecuritygroup76DA136C", "GroupId" ] } @@ -1329,7 +1331,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "noArgumentsECRDKRsecuritygroup881C3744", + "farfhsnoArgumentsECRDKRsecuritygroup1BE4BAB0", "GroupId" ] } @@ -1393,10 +1395,10 @@ } } }, - "noArgumentsKINESISFIREHOSEsecuritygroupBE0C0999": { + "farfhsnoArgumentsKINESISFIREHOSEsecuritygroup0EB96AE5": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "noArguments/noArguments-KINESIS_FIREHOSE-security-group", + "GroupDescription": "farfhs-noArguments/farfhs-noArguments-KINESIS_FIREHOSE-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1451,10 +1453,10 @@ } } }, - "noArgumentsECRAPIsecuritygroup70B67825": { + "farfhsnoArgumentsECRAPIsecuritygroup76DA136C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "noArguments/noArguments-ECR_API-security-group", + "GroupDescription": "farfhs-noArguments/farfhs-noArguments-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1509,10 +1511,10 @@ } } }, - "noArgumentsECRDKRsecuritygroup881C3744": { + "farfhsnoArgumentsECRDKRsecuritygroup1BE4BAB0": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "noArguments/noArguments-ECR_DKR-security-group", + "GroupDescription": "farfhs-noArguments/farfhs-noArguments-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1626,7 +1628,7 @@ "Environment": [ { "Name": "FIREHOSE_DELIVERYSTREAM_NAME", - "Value": "KinesisFirehosenoArgumentsdestinationfirehose7F26EC12" + "Value": "KinesisFirehosefarfhsnoArgumentsdestinationfirehose6033CCDA" } ], "Essential": true, @@ -1642,7 +1644,7 @@ } ], "Cpu": "256", - "Family": "noArgumentstestconstructtaskdefD800F6F2", + "Family": "farfhsnoArgumentstestconstructtaskdefC49D5E71", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-noArguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.noArguments.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-noArguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-vpcFromprops.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-vpcFromprops.expected.json index 1c7b97b8e..08f33a65d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-vpcFromprops.expected.json @@ -85,6 +85,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -274,6 +275,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -466,7 +468,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosevpcFrompropsdestinationfirehoseD15200E2", + "DeliveryStreamName": "KinesisFirehosefarfhsvpcFrompropsdestinationfirehoseE3FE1793", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -550,7 +552,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -607,7 +609,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc" + "Value": "farfhs-vpcFromprops/Vpc" } ] } @@ -629,7 +631,7 @@ }, { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet1" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet1" } ], "VpcId": { @@ -653,7 +655,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet1" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet1" } ], "VpcId": { @@ -694,7 +696,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet1" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet1" } ] } @@ -714,7 +716,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet1" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet1" } ] }, @@ -740,7 +742,7 @@ }, { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet2" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet2" } ], "VpcId": { @@ -764,7 +766,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet2" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet2" } ], "VpcId": { @@ -805,7 +807,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet2" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet2" } ] } @@ -825,7 +827,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet2" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet2" } ] }, @@ -851,7 +853,7 @@ }, { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet3" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet3" } ], "VpcId": { @@ -875,7 +877,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet3" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet3" } ], "VpcId": { @@ -916,7 +918,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet3" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet3" } ] } @@ -936,7 +938,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PublicSubnet3" + "Value": "farfhs-vpcFromprops/Vpc/PublicSubnet3" } ] }, @@ -962,7 +964,7 @@ }, { "Key": "Name", - "Value": "vpcFromprops/Vpc/PrivateSubnet1" + "Value": "farfhs-vpcFromprops/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -976,7 +978,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PrivateSubnet1" + "Value": "farfhs-vpcFromprops/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -1024,7 +1026,7 @@ }, { "Key": "Name", - "Value": "vpcFromprops/Vpc/PrivateSubnet2" + "Value": "farfhs-vpcFromprops/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1038,7 +1040,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PrivateSubnet2" + "Value": "farfhs-vpcFromprops/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1086,7 +1088,7 @@ }, { "Key": "Name", - "Value": "vpcFromprops/Vpc/PrivateSubnet3" + "Value": "farfhs-vpcFromprops/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1100,7 +1102,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/PrivateSubnet3" + "Value": "farfhs-vpcFromprops/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1137,7 +1139,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc" + "Value": "farfhs-vpcFromprops/Vpc" } ] } @@ -1171,7 +1173,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/FlowLog" + "Value": "farfhs-vpcFromprops/Vpc/FlowLog" } ] } @@ -1223,7 +1225,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/FlowLog" + "Value": "farfhs-vpcFromprops/Vpc/FlowLog" } ] }, @@ -1260,7 +1262,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromprops/Vpc/FlowLog" + "Value": "farfhs-vpcFromprops/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1273,7 +1275,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "vpcFrompropsKINESISFIREHOSEsecuritygroup537BDD19", + "farfhsvpcFrompropsKINESISFIREHOSEsecuritygroupF7736351", "GroupId" ] } @@ -1314,7 +1316,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "vpcFrompropsECRAPIsecuritygroupB070D1AB", + "farfhsvpcFrompropsECRAPIsecuritygroup81441B71", "GroupId" ] } @@ -1355,7 +1357,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "vpcFrompropsECRDKRsecuritygroup4D8AFEF5", + "farfhsvpcFrompropsECRDKRsecuritygroup660BD496", "GroupId" ] } @@ -1430,10 +1432,10 @@ } } }, - "vpcFrompropsKINESISFIREHOSEsecuritygroup537BDD19": { + "farfhsvpcFrompropsKINESISFIREHOSEsecuritygroupF7736351": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "vpcFromprops/vpcFromprops-KINESIS_FIREHOSE-security-group", + "GroupDescription": "farfhs-vpcFromprops/farfhs-vpcFromprops-KINESIS_FIREHOSE-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1488,10 +1490,10 @@ } } }, - "vpcFrompropsECRAPIsecuritygroupB070D1AB": { + "farfhsvpcFrompropsECRAPIsecuritygroup81441B71": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "vpcFromprops/vpcFromprops-ECR_API-security-group", + "GroupDescription": "farfhs-vpcFromprops/farfhs-vpcFromprops-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1546,10 +1548,10 @@ } } }, - "vpcFrompropsECRDKRsecuritygroup4D8AFEF5": { + "farfhsvpcFrompropsECRDKRsecuritygroup660BD496": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "vpcFromprops/vpcFromprops-ECR_DKR-security-group", + "GroupDescription": "farfhs-vpcFromprops/farfhs-vpcFromprops-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1663,7 +1665,7 @@ "Environment": [ { "Name": "FIREHOSE_DELIVERYSTREAM_NAME", - "Value": "KinesisFirehosevpcFrompropsdestinationfirehoseD15200E2" + "Value": "KinesisFirehosefarfhsvpcFrompropsdestinationfirehoseE3FE1793" } ], "Essential": true, @@ -1679,7 +1681,7 @@ } ], "Cpu": "256", - "Family": "vpcFrompropstestfargatekinesisstreamstaskdefA9FE914A", + "Family": "farfhsvpcFrompropstestfargatekinesisstreamstaskdef8AB11D78", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-vpcFromprops.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.vpcFromprops.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisfirehose/test/integ.farfhs-vpcFromprops.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingFargateService.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingFargateService.expected.json index 94ad4f26a..725fabc6f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingFargateService.expected.json @@ -10,7 +10,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "farkin-existingFargateService/Vpc" } ] } @@ -32,7 +32,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet1" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet1" } ], "VpcId": { @@ -56,7 +56,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet1" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet1" } ], "VpcId": { @@ -97,7 +97,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet1" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet1" } ] } @@ -117,7 +117,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet1" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet1" } ] }, @@ -143,7 +143,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet2" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet2" } ], "VpcId": { @@ -167,7 +167,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet2" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet2" } ], "VpcId": { @@ -208,7 +208,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet2" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet2" } ] } @@ -228,7 +228,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet2" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet2" } ] }, @@ -254,7 +254,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet3" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet3" } ], "VpcId": { @@ -278,7 +278,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet3" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet3" } ], "VpcId": { @@ -319,7 +319,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet3" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet3" } ] } @@ -339,7 +339,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PublicSubnet3" + "Value": "farkin-existingFargateService/Vpc/PublicSubnet3" } ] }, @@ -365,7 +365,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet1" + "Value": "farkin-existingFargateService/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -379,7 +379,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet1" + "Value": "farkin-existingFargateService/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -427,7 +427,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet2" + "Value": "farkin-existingFargateService/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -441,7 +441,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet2" + "Value": "farkin-existingFargateService/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -489,7 +489,7 @@ }, { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet3" + "Value": "farkin-existingFargateService/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -503,7 +503,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/PrivateSubnet3" + "Value": "farkin-existingFargateService/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc" + "Value": "farkin-existingFargateService/Vpc" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/FlowLog" + "Value": "farkin-existingFargateService/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/FlowLog" + "Value": "farkin-existingFargateService/Vpc/FlowLog" } ] }, @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingFargateService/Vpc/FlowLog" + "Value": "farkin-existingFargateService/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -676,7 +676,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingFargateServiceECRAPIsecuritygroup5EE2643E", + "farkinexistingFargateServiceECRAPIsecuritygroupF2455F12", "GroupId" ] } @@ -717,7 +717,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingFargateServiceECRDKRsecuritygroup41F182BE", + "farkinexistingFargateServiceECRDKRsecuritygroup449EDD78", "GroupId" ] } @@ -799,7 +799,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingFargateServiceKINESISSTREAMSsecuritygroup182A19D5", + "farkinexistingFargateServiceKINESISSTREAMSsecuritygroup21CA24CF", "GroupId" ] } @@ -833,10 +833,10 @@ } } }, - "existingFargateServiceECRAPIsecuritygroup5EE2643E": { + "farkinexistingFargateServiceECRAPIsecuritygroupF2455F12": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingFargateService/existingFargateService-ECR_API-security-group", + "GroupDescription": "farkin-existingFargateService/farkin-existingFargateService-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -891,10 +891,10 @@ } } }, - "existingFargateServiceECRDKRsecuritygroup41F182BE": { + "farkinexistingFargateServiceECRDKRsecuritygroup449EDD78": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingFargateService/existingFargateService-ECR_DKR-security-group", + "GroupDescription": "farkin-existingFargateService/farkin-existingFargateService-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1025,7 +1025,7 @@ } ], "Cpu": "256", - "Family": "existingFargateServicetesttaskdef55189A31", + "Family": "farkinexistingFargateServicetesttaskdefC5C56F23", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1158,10 +1158,10 @@ "Threshold": 0 } }, - "existingFargateServiceKINESISSTREAMSsecuritygroup182A19D5": { + "farkinexistingFargateServiceKINESISSTREAMSsecuritygroup21CA24CF": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingFargateService/existingFargateService-KINESIS_STREAMS-security-group", + "GroupDescription": "farkin-existingFargateService/farkin-existingFargateService-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingFargateService.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingFargateService.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingFargateService.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingStream.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingStream.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingStream.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingStream.expected.json index 28cff9b56..bc197bbc8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingStream.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingStream.expected.json @@ -49,7 +49,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc" + "Value": "farkin-existingStream/Vpc" } ] } @@ -71,7 +71,7 @@ }, { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet1" + "Value": "farkin-existingStream/Vpc/PublicSubnet1" } ], "VpcId": { @@ -95,7 +95,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet1" + "Value": "farkin-existingStream/Vpc/PublicSubnet1" } ], "VpcId": { @@ -136,7 +136,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet1" + "Value": "farkin-existingStream/Vpc/PublicSubnet1" } ] } @@ -156,7 +156,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet1" + "Value": "farkin-existingStream/Vpc/PublicSubnet1" } ] }, @@ -182,7 +182,7 @@ }, { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet2" + "Value": "farkin-existingStream/Vpc/PublicSubnet2" } ], "VpcId": { @@ -206,7 +206,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet2" + "Value": "farkin-existingStream/Vpc/PublicSubnet2" } ], "VpcId": { @@ -247,7 +247,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet2" + "Value": "farkin-existingStream/Vpc/PublicSubnet2" } ] } @@ -267,7 +267,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet2" + "Value": "farkin-existingStream/Vpc/PublicSubnet2" } ] }, @@ -293,7 +293,7 @@ }, { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet3" + "Value": "farkin-existingStream/Vpc/PublicSubnet3" } ], "VpcId": { @@ -317,7 +317,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet3" + "Value": "farkin-existingStream/Vpc/PublicSubnet3" } ], "VpcId": { @@ -358,7 +358,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet3" + "Value": "farkin-existingStream/Vpc/PublicSubnet3" } ] } @@ -378,7 +378,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PublicSubnet3" + "Value": "farkin-existingStream/Vpc/PublicSubnet3" } ] }, @@ -404,7 +404,7 @@ }, { "Key": "Name", - "Value": "existingStream/Vpc/PrivateSubnet1" + "Value": "farkin-existingStream/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -418,7 +418,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PrivateSubnet1" + "Value": "farkin-existingStream/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -466,7 +466,7 @@ }, { "Key": "Name", - "Value": "existingStream/Vpc/PrivateSubnet2" + "Value": "farkin-existingStream/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -480,7 +480,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PrivateSubnet2" + "Value": "farkin-existingStream/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -528,7 +528,7 @@ }, { "Key": "Name", - "Value": "existingStream/Vpc/PrivateSubnet3" + "Value": "farkin-existingStream/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -542,7 +542,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/PrivateSubnet3" + "Value": "farkin-existingStream/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -579,7 +579,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc" + "Value": "farkin-existingStream/Vpc" } ] } @@ -613,7 +613,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/FlowLog" + "Value": "farkin-existingStream/Vpc/FlowLog" } ] } @@ -665,7 +665,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/FlowLog" + "Value": "farkin-existingStream/Vpc/FlowLog" } ] }, @@ -702,7 +702,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingStream/Vpc/FlowLog" + "Value": "farkin-existingStream/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -715,7 +715,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingStreamKINESISSTREAMSsecuritygroup14C04A5F", + "farkinexistingStreamKINESISSTREAMSsecuritygroup2555F81B", "GroupId" ] } @@ -756,7 +756,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingStreamECRAPIsecuritygroup4E9C019E", + "farkinexistingStreamECRAPIsecuritygroup4D631094", "GroupId" ] } @@ -797,7 +797,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingStreamECRDKRsecuritygroup5C8931AB", + "farkinexistingStreamECRDKRsecuritygroup6C2FE279", "GroupId" ] } @@ -872,10 +872,10 @@ } } }, - "existingStreamKINESISSTREAMSsecuritygroup14C04A5F": { + "farkinexistingStreamKINESISSTREAMSsecuritygroup2555F81B": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingStream/existingStream-KINESIS_STREAMS-security-group", + "GroupDescription": "farkin-existingStream/farkin-existingStream-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -930,10 +930,10 @@ } } }, - "existingStreamECRAPIsecuritygroup4E9C019E": { + "farkinexistingStreamECRAPIsecuritygroup4D631094": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingStream/existingStream-ECR_API-security-group", + "GroupDescription": "farkin-existingStream/farkin-existingStream-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -988,10 +988,10 @@ } } }, - "existingStreamECRDKRsecuritygroup5C8931AB": { + "farkinexistingStreamECRDKRsecuritygroup6C2FE279": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingStream/existingStream-ECR_DKR-security-group", + "GroupDescription": "farkin-existingStream/farkin-existingStream-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1122,7 +1122,7 @@ } ], "Cpu": "256", - "Family": "existingStreamtestfargatekinesisstreamstaskdefD159DB28", + "Family": "farkinexistingStreamtestfargatekinesisstreamstaskdef3D866938", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingStream.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingStream.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingStream.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingStream.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingVpc.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingVpc.expected.json index b5492ad94..7e8c373e1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingVpc.expected.json @@ -10,7 +10,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "farkin-existingVpc/Vpc" } ] } @@ -32,7 +32,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "farkin-existingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -56,7 +56,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "farkin-existingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -97,7 +97,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "farkin-existingVpc/Vpc/PublicSubnet1" } ] } @@ -117,7 +117,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "farkin-existingVpc/Vpc/PublicSubnet1" } ] }, @@ -143,7 +143,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "farkin-existingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -167,7 +167,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "farkin-existingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -208,7 +208,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "farkin-existingVpc/Vpc/PublicSubnet2" } ] } @@ -228,7 +228,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "farkin-existingVpc/Vpc/PublicSubnet2" } ] }, @@ -254,7 +254,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "farkin-existingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -278,7 +278,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "farkin-existingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -319,7 +319,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "farkin-existingVpc/Vpc/PublicSubnet3" } ] } @@ -339,7 +339,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "farkin-existingVpc/Vpc/PublicSubnet3" } ] }, @@ -365,7 +365,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet1" + "Value": "farkin-existingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -379,7 +379,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet1" + "Value": "farkin-existingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -427,7 +427,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet2" + "Value": "farkin-existingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -441,7 +441,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet2" + "Value": "farkin-existingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -489,7 +489,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet3" + "Value": "farkin-existingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -503,7 +503,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet3" + "Value": "farkin-existingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "farkin-existingVpc/Vpc" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/FlowLog" + "Value": "farkin-existingVpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/FlowLog" + "Value": "farkin-existingVpc/Vpc/FlowLog" } ] }, @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/FlowLog" + "Value": "farkin-existingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -676,7 +676,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingVpcKINESISSTREAMSsecuritygroupDE0E9DB9", + "farkinexistingVpcKINESISSTREAMSsecuritygroupB4DB27F8", "GroupId" ] } @@ -717,7 +717,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingVpcECRAPIsecuritygroupB3E4A376", + "farkinexistingVpcECRAPIsecuritygroupFF0E68D3", "GroupId" ] } @@ -758,7 +758,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingVpcECRDKRsecuritygroup0500FAE6", + "farkinexistingVpcECRDKRsecuritygroup5D9945D5", "GroupId" ] } @@ -870,10 +870,10 @@ "Threshold": 0 } }, - "existingVpcKINESISSTREAMSsecuritygroupDE0E9DB9": { + "farkinexistingVpcKINESISSTREAMSsecuritygroupB4DB27F8": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingVpc/existingVpc-KINESIS_STREAMS-security-group", + "GroupDescription": "farkin-existingVpc/farkin-existingVpc-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -928,10 +928,10 @@ } } }, - "existingVpcECRAPIsecuritygroupB3E4A376": { + "farkinexistingVpcECRAPIsecuritygroupFF0E68D3": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingVpc/existingVpc-ECR_API-security-group", + "GroupDescription": "farkin-existingVpc/farkin-existingVpc-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -986,10 +986,10 @@ } } }, - "existingVpcECRDKRsecuritygroup0500FAE6": { + "farkinexistingVpcECRDKRsecuritygroup5D9945D5": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingVpc/existingVpc-ECR_DKR-security-group", + "GroupDescription": "farkin-existingVpc/farkin-existingVpc-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1120,7 +1120,7 @@ } ], "Cpu": "256", - "Family": "existingVpctestfargatekinesisstreamstaskdefAAC2A3A2", + "Family": "farkinexistingVpctestfargatekinesisstreamstaskdefA4B32618", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.existingVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-existingVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-fargateServiceFromProps.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-fargateServiceFromProps.expected.json index c5d5c91b5..a31e3f2f3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-fargateServiceFromProps.expected.json @@ -47,7 +47,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "farkin-fargateServiceFromProps/Vpc" } ] } @@ -69,7 +69,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet1" } ], "VpcId": { @@ -93,7 +93,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet1" } ], "VpcId": { @@ -134,7 +134,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet1" } ] } @@ -154,7 +154,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet1" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet1" } ] }, @@ -180,7 +180,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet2" } ], "VpcId": { @@ -204,7 +204,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet2" } ], "VpcId": { @@ -245,7 +245,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet2" } ] } @@ -265,7 +265,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet2" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet2" } ] }, @@ -291,7 +291,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet3" } ], "VpcId": { @@ -315,7 +315,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet3" } ], "VpcId": { @@ -356,7 +356,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet3" } ] } @@ -376,7 +376,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PublicSubnet3" + "Value": "farkin-fargateServiceFromProps/Vpc/PublicSubnet3" } ] }, @@ -402,7 +402,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet1" + "Value": "farkin-fargateServiceFromProps/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -416,7 +416,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet1" + "Value": "farkin-fargateServiceFromProps/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -464,7 +464,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet2" + "Value": "farkin-fargateServiceFromProps/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -478,7 +478,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet2" + "Value": "farkin-fargateServiceFromProps/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -526,7 +526,7 @@ }, { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet3" + "Value": "farkin-fargateServiceFromProps/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/PrivateSubnet3" + "Value": "farkin-fargateServiceFromProps/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -577,7 +577,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc" + "Value": "farkin-fargateServiceFromProps/Vpc" } ] } @@ -611,7 +611,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/FlowLog" + "Value": "farkin-fargateServiceFromProps/Vpc/FlowLog" } ] } @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/FlowLog" + "Value": "farkin-fargateServiceFromProps/Vpc/FlowLog" } ] }, @@ -700,7 +700,7 @@ "Tags": [ { "Key": "Name", - "Value": "fargateServiceFromProps/Vpc/FlowLog" + "Value": "farkin-fargateServiceFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -713,7 +713,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "fargateServiceFromPropsKINESISSTREAMSsecuritygroup6FD7F225", + "farkinfargateServiceFromPropsKINESISSTREAMSsecuritygroupCB85FA0B", "GroupId" ] } @@ -754,7 +754,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "fargateServiceFromPropsECRAPIsecuritygroup5784F80B", + "farkinfargateServiceFromPropsECRAPIsecuritygroup9D2C3426", "GroupId" ] } @@ -795,7 +795,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "fargateServiceFromPropsECRDKRsecuritygroup9E1C301F", + "farkinfargateServiceFromPropsECRDKRsecuritygroupB0FEA175", "GroupId" ] } @@ -870,10 +870,10 @@ } } }, - "fargateServiceFromPropsKINESISSTREAMSsecuritygroup6FD7F225": { + "farkinfargateServiceFromPropsKINESISSTREAMSsecuritygroupCB85FA0B": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "fargateServiceFromProps/fargateServiceFromProps-KINESIS_STREAMS-security-group", + "GroupDescription": "farkin-fargateServiceFromProps/farkin-fargateServiceFromProps-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -928,10 +928,10 @@ } } }, - "fargateServiceFromPropsECRAPIsecuritygroup5784F80B": { + "farkinfargateServiceFromPropsECRAPIsecuritygroup9D2C3426": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "fargateServiceFromProps/fargateServiceFromProps-ECR_API-security-group", + "GroupDescription": "farkin-fargateServiceFromProps/farkin-fargateServiceFromProps-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -986,10 +986,10 @@ } } }, - "fargateServiceFromPropsECRDKRsecuritygroup9E1C301F": { + "farkinfargateServiceFromPropsECRDKRsecuritygroupB0FEA175": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "fargateServiceFromProps/fargateServiceFromProps-ECR_DKR-security-group", + "GroupDescription": "farkin-fargateServiceFromProps/farkin-fargateServiceFromProps-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1120,7 +1120,7 @@ } ], "Cpu": "256", - "Family": "fargateServiceFromPropstestfargatekinesisstreamstaskdef00ED69EC", + "Family": "farkinfargateServiceFromPropstestfargatekinesisstreamstaskdef2D7B0207", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-fargateServiceFromProps.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.fargateServiceFromProps.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-fargateServiceFromProps.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-noArguments.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-noArguments.expected.json index 6b84aee7b..ff1a55045 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-noArguments.expected.json @@ -47,7 +47,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "farkin-noArguments/Vpc" } ] } @@ -69,7 +69,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet1" + "Value": "farkin-noArguments/Vpc/PublicSubnet1" } ], "VpcId": { @@ -93,7 +93,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet1" + "Value": "farkin-noArguments/Vpc/PublicSubnet1" } ], "VpcId": { @@ -134,7 +134,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet1" + "Value": "farkin-noArguments/Vpc/PublicSubnet1" } ] } @@ -154,7 +154,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet1" + "Value": "farkin-noArguments/Vpc/PublicSubnet1" } ] }, @@ -180,7 +180,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet2" + "Value": "farkin-noArguments/Vpc/PublicSubnet2" } ], "VpcId": { @@ -204,7 +204,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet2" + "Value": "farkin-noArguments/Vpc/PublicSubnet2" } ], "VpcId": { @@ -245,7 +245,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet2" + "Value": "farkin-noArguments/Vpc/PublicSubnet2" } ] } @@ -265,7 +265,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet2" + "Value": "farkin-noArguments/Vpc/PublicSubnet2" } ] }, @@ -291,7 +291,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet3" + "Value": "farkin-noArguments/Vpc/PublicSubnet3" } ], "VpcId": { @@ -315,7 +315,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet3" + "Value": "farkin-noArguments/Vpc/PublicSubnet3" } ], "VpcId": { @@ -356,7 +356,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet3" + "Value": "farkin-noArguments/Vpc/PublicSubnet3" } ] } @@ -376,7 +376,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PublicSubnet3" + "Value": "farkin-noArguments/Vpc/PublicSubnet3" } ] }, @@ -402,7 +402,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet1" + "Value": "farkin-noArguments/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -416,7 +416,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet1" + "Value": "farkin-noArguments/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -464,7 +464,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet2" + "Value": "farkin-noArguments/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -478,7 +478,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet2" + "Value": "farkin-noArguments/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -526,7 +526,7 @@ }, { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet3" + "Value": "farkin-noArguments/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/PrivateSubnet3" + "Value": "farkin-noArguments/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -577,7 +577,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc" + "Value": "farkin-noArguments/Vpc" } ] } @@ -611,7 +611,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/FlowLog" + "Value": "farkin-noArguments/Vpc/FlowLog" } ] } @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/FlowLog" + "Value": "farkin-noArguments/Vpc/FlowLog" } ] }, @@ -700,7 +700,7 @@ "Tags": [ { "Key": "Name", - "Value": "noArguments/Vpc/FlowLog" + "Value": "farkin-noArguments/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -713,7 +713,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "noArgumentsKINESISSTREAMSsecuritygroupA5FDBE79", + "farkinnoArgumentsKINESISSTREAMSsecuritygroup96006AA6", "GroupId" ] } @@ -754,7 +754,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "noArgumentsECRAPIsecuritygroup70B67825", + "farkinnoArgumentsECRAPIsecuritygroupC89CB01F", "GroupId" ] } @@ -795,7 +795,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "noArgumentsECRDKRsecuritygroup881C3744", + "farkinnoArgumentsECRDKRsecuritygroupC8F0FF04", "GroupId" ] } @@ -870,10 +870,10 @@ } } }, - "noArgumentsKINESISSTREAMSsecuritygroupA5FDBE79": { + "farkinnoArgumentsKINESISSTREAMSsecuritygroup96006AA6": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "noArguments/noArguments-KINESIS_STREAMS-security-group", + "GroupDescription": "farkin-noArguments/farkin-noArguments-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -928,10 +928,10 @@ } } }, - "noArgumentsECRAPIsecuritygroup70B67825": { + "farkinnoArgumentsECRAPIsecuritygroupC89CB01F": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "noArguments/noArguments-ECR_API-security-group", + "GroupDescription": "farkin-noArguments/farkin-noArguments-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -986,10 +986,10 @@ } } }, - "noArgumentsECRDKRsecuritygroup881C3744": { + "farkinnoArgumentsECRDKRsecuritygroupC8F0FF04": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "noArguments/noArguments-ECR_DKR-security-group", + "GroupDescription": "farkin-noArguments/farkin-noArguments-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1120,7 +1120,7 @@ } ], "Cpu": "256", - "Family": "noArgumentstestfargatekinesisstreamstaskdef80D83FB4", + "Family": "farkinnoArgumentstestfargatekinesisstreamstaskdefE3913C8B", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-noArguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.noArguments.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-noArguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.streamFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-streamFromProps.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.streamFromProps.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-streamFromProps.expected.json index 1e6781fb8..a05be9cee 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.streamFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-streamFromProps.expected.json @@ -49,7 +49,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc" + "Value": "farkin-streamFromProps/Vpc" } ] } @@ -71,7 +71,7 @@ }, { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet1" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet1" } ], "VpcId": { @@ -95,7 +95,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet1" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet1" } ], "VpcId": { @@ -136,7 +136,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet1" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet1" } ] } @@ -156,7 +156,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet1" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet1" } ] }, @@ -182,7 +182,7 @@ }, { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet2" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet2" } ], "VpcId": { @@ -206,7 +206,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet2" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet2" } ], "VpcId": { @@ -247,7 +247,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet2" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet2" } ] } @@ -267,7 +267,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet2" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet2" } ] }, @@ -293,7 +293,7 @@ }, { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet3" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet3" } ], "VpcId": { @@ -317,7 +317,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet3" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet3" } ], "VpcId": { @@ -358,7 +358,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet3" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet3" } ] } @@ -378,7 +378,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PublicSubnet3" + "Value": "farkin-streamFromProps/Vpc/PublicSubnet3" } ] }, @@ -404,7 +404,7 @@ }, { "Key": "Name", - "Value": "streamFromProps/Vpc/PrivateSubnet1" + "Value": "farkin-streamFromProps/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -418,7 +418,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PrivateSubnet1" + "Value": "farkin-streamFromProps/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -466,7 +466,7 @@ }, { "Key": "Name", - "Value": "streamFromProps/Vpc/PrivateSubnet2" + "Value": "farkin-streamFromProps/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -480,7 +480,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PrivateSubnet2" + "Value": "farkin-streamFromProps/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -528,7 +528,7 @@ }, { "Key": "Name", - "Value": "streamFromProps/Vpc/PrivateSubnet3" + "Value": "farkin-streamFromProps/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -542,7 +542,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/PrivateSubnet3" + "Value": "farkin-streamFromProps/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -579,7 +579,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc" + "Value": "farkin-streamFromProps/Vpc" } ] } @@ -613,7 +613,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/FlowLog" + "Value": "farkin-streamFromProps/Vpc/FlowLog" } ] } @@ -665,7 +665,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/FlowLog" + "Value": "farkin-streamFromProps/Vpc/FlowLog" } ] }, @@ -702,7 +702,7 @@ "Tags": [ { "Key": "Name", - "Value": "streamFromProps/Vpc/FlowLog" + "Value": "farkin-streamFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -715,7 +715,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "streamFromPropsKINESISSTREAMSsecuritygroup68986EDF", + "farkinstreamFromPropsKINESISSTREAMSsecuritygroup17D52D6E", "GroupId" ] } @@ -756,7 +756,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "streamFromPropsECRAPIsecuritygroupFDB580C0", + "farkinstreamFromPropsECRAPIsecuritygroup9B78C16A", "GroupId" ] } @@ -797,7 +797,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "streamFromPropsECRDKRsecuritygroupEB1BC2F0", + "farkinstreamFromPropsECRDKRsecuritygroup153D1633", "GroupId" ] } @@ -872,10 +872,10 @@ } } }, - "streamFromPropsKINESISSTREAMSsecuritygroup68986EDF": { + "farkinstreamFromPropsKINESISSTREAMSsecuritygroup17D52D6E": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "streamFromProps/streamFromProps-KINESIS_STREAMS-security-group", + "GroupDescription": "farkin-streamFromProps/farkin-streamFromProps-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -930,10 +930,10 @@ } } }, - "streamFromPropsECRAPIsecuritygroupFDB580C0": { + "farkinstreamFromPropsECRAPIsecuritygroup9B78C16A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "streamFromProps/streamFromProps-ECR_API-security-group", + "GroupDescription": "farkin-streamFromProps/farkin-streamFromProps-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -988,10 +988,10 @@ } } }, - "streamFromPropsECRDKRsecuritygroupEB1BC2F0": { + "farkinstreamFromPropsECRDKRsecuritygroup153D1633": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "streamFromProps/streamFromProps-ECR_DKR-security-group", + "GroupDescription": "farkin-streamFromProps/farkin-streamFromProps-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1122,7 +1122,7 @@ } ], "Cpu": "256", - "Family": "streamFromPropstestfargatekinesisstreamstaskdef639261D4", + "Family": "farkinstreamFromPropstestfargatekinesisstreamstaskdef47CE87EA", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.streamFromProps.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-streamFromProps.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.streamFromProps.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-streamFromProps.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-vpcFromProps.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-vpcFromProps.expected.json index 9532f7b9d..a0ae90072 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-vpcFromProps.expected.json @@ -47,7 +47,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc" + "Value": "farkin-vpcFromProps/Vpc" } ] } @@ -69,7 +69,7 @@ }, { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet1" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet1" } ], "VpcId": { @@ -93,7 +93,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet1" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet1" } ], "VpcId": { @@ -134,7 +134,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet1" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet1" } ] } @@ -154,7 +154,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet1" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet1" } ] }, @@ -180,7 +180,7 @@ }, { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet2" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet2" } ], "VpcId": { @@ -204,7 +204,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet2" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet2" } ], "VpcId": { @@ -245,7 +245,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet2" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet2" } ] } @@ -265,7 +265,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet2" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet2" } ] }, @@ -291,7 +291,7 @@ }, { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet3" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet3" } ], "VpcId": { @@ -315,7 +315,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet3" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet3" } ], "VpcId": { @@ -356,7 +356,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet3" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet3" } ] } @@ -376,7 +376,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PublicSubnet3" + "Value": "farkin-vpcFromProps/Vpc/PublicSubnet3" } ] }, @@ -402,7 +402,7 @@ }, { "Key": "Name", - "Value": "vpcFromProps/Vpc/PrivateSubnet1" + "Value": "farkin-vpcFromProps/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -416,7 +416,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PrivateSubnet1" + "Value": "farkin-vpcFromProps/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -464,7 +464,7 @@ }, { "Key": "Name", - "Value": "vpcFromProps/Vpc/PrivateSubnet2" + "Value": "farkin-vpcFromProps/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -478,7 +478,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PrivateSubnet2" + "Value": "farkin-vpcFromProps/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -526,7 +526,7 @@ }, { "Key": "Name", - "Value": "vpcFromProps/Vpc/PrivateSubnet3" + "Value": "farkin-vpcFromProps/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/PrivateSubnet3" + "Value": "farkin-vpcFromProps/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -577,7 +577,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc" + "Value": "farkin-vpcFromProps/Vpc" } ] } @@ -611,7 +611,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/FlowLog" + "Value": "farkin-vpcFromProps/Vpc/FlowLog" } ] } @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/FlowLog" + "Value": "farkin-vpcFromProps/Vpc/FlowLog" } ] }, @@ -700,7 +700,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpcFromProps/Vpc/FlowLog" + "Value": "farkin-vpcFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -713,7 +713,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "vpcFromPropsKINESISSTREAMSsecuritygroupB4A9EE00", + "farkinvpcFromPropsKINESISSTREAMSsecuritygroup89119531", "GroupId" ] } @@ -754,7 +754,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "vpcFromPropsECRAPIsecuritygroup5AF6C0C4", + "farkinvpcFromPropsECRAPIsecuritygroup60FDBCC4", "GroupId" ] } @@ -795,7 +795,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "vpcFromPropsECRDKRsecuritygroup822718EC", + "farkinvpcFromPropsECRDKRsecuritygroup32D87A6D", "GroupId" ] } @@ -870,10 +870,10 @@ } } }, - "vpcFromPropsKINESISSTREAMSsecuritygroupB4A9EE00": { + "farkinvpcFromPropsKINESISSTREAMSsecuritygroup89119531": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "vpcFromProps/vpcFromProps-KINESIS_STREAMS-security-group", + "GroupDescription": "farkin-vpcFromProps/farkin-vpcFromProps-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -928,10 +928,10 @@ } } }, - "vpcFromPropsECRAPIsecuritygroup5AF6C0C4": { + "farkinvpcFromPropsECRAPIsecuritygroup60FDBCC4": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "vpcFromProps/vpcFromProps-ECR_API-security-group", + "GroupDescription": "farkin-vpcFromProps/farkin-vpcFromProps-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -986,10 +986,10 @@ } } }, - "vpcFromPropsECRDKRsecuritygroup822718EC": { + "farkinvpcFromPropsECRDKRsecuritygroup32D87A6D": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "vpcFromProps/vpcFromProps-ECR_DKR-security-group", + "GroupDescription": "farkin-vpcFromProps/farkin-vpcFromProps-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1120,7 +1120,7 @@ } ], "Cpu": "256", - "Family": "vpcFromPropstestfargatekinesisstreamstaskdef222FE29E", + "Family": "farkinvpcFromPropstestfargatekinesisstreamstaskdef1CE5A89B", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-vpcFromProps.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.vpcFromProps.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-kinesisstreams/test/integ.farkin-vpcFromProps.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-existing-resources.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-existing-resources.expected.json index 4e43f850b..469ccbc84 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-existing-resources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "faropn-existing-resources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "faropn-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "faropn-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "faropn-existing-resources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "faropn-existing-resources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "faropn-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "faropn-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "faropn-existing-resources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "faropn-existing-resources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "faropn-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "faropn-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "faropn-existing-resources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "faropn-existing-resources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "faropn-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "faropn-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "faropn-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "faropn-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "faropn-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "faropn-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "faropn-existing-resources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "faropn-existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "faropn-existing-resources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "faropn-existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRAPIsecuritygroup78294485", + "faropnexistingresourcesECRAPIsecuritygroup9E21D9FB", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRDKRsecuritygroup598BA37E", + "faropnexistingresourcesECRDKRsecuritygroupCF68611A", "GroupId" ] } @@ -771,10 +771,10 @@ } } }, - "existingresourcesECRAPIsecuritygroup78294485": { + "faropnexistingresourcesECRAPIsecuritygroup9E21D9FB": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_API-security-group", + "GroupDescription": "faropn-existing-resources/faropn-existing-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -829,10 +829,10 @@ } } }, - "existingresourcesECRDKRsecuritygroup598BA37E": { + "faropnexistingresourcesECRDKRsecuritygroupCF68611A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_DKR-security-group", + "GroupDescription": "faropn-existing-resources/faropn-existing-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -936,7 +936,7 @@ } ], "Cpu": "256", - "Family": "existingresourcestesttaskdef88B214A2", + "Family": "faropnexistingresourcestesttaskdefE1B083DB", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-existing-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.existing-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-existing-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-new-resources.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-new-resources.expected.json index 1887e8c57..f554a190b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-new-resources.expected.json @@ -84,7 +84,7 @@ "testconstructUserPoolDomain6B64F32F": { "Type": "AWS::Cognito::UserPoolDomain", "Properties": { - "Domain": "solution-constructs", + "Domain": "faropn-new-resources", "UserPoolId": { "Ref": "testconstructCognitoUserPoolA4991355" } @@ -141,7 +141,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/solution-constructs/*" + ":domain/faropn-new-resources/*" ] ] } @@ -254,7 +254,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/solution-constructs" + ":domain/faropn-new-resources" ] ] } @@ -318,7 +318,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/solution-constructs/*" + ":domain/faropn-new-resources/*" ] ] } @@ -354,7 +354,7 @@ "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, - "DomainName": "solution-constructs", + "DomainName": "faropn-new-resources", "EBSOptions": { "EBSEnabled": true, "VolumeSize": 10 @@ -533,7 +533,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "faropn-new-resources/Vpc" } ] } @@ -555,7 +555,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "faropn-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -579,7 +579,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "faropn-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -620,7 +620,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "faropn-new-resources/Vpc/PublicSubnet1" } ] } @@ -640,7 +640,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "faropn-new-resources/Vpc/PublicSubnet1" } ] }, @@ -666,7 +666,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "faropn-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -690,7 +690,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "faropn-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -731,7 +731,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "faropn-new-resources/Vpc/PublicSubnet2" } ] } @@ -751,7 +751,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "faropn-new-resources/Vpc/PublicSubnet2" } ] }, @@ -777,7 +777,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "faropn-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -801,7 +801,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "faropn-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -842,7 +842,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "faropn-new-resources/Vpc/PublicSubnet3" } ] } @@ -862,7 +862,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "faropn-new-resources/Vpc/PublicSubnet3" } ] }, @@ -888,7 +888,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "faropn-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -902,7 +902,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "faropn-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -950,7 +950,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "faropn-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -964,7 +964,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "faropn-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1012,7 +1012,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "faropn-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1026,7 +1026,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "faropn-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1063,7 +1063,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "faropn-new-resources/Vpc" } ] } @@ -1097,7 +1097,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "faropn-new-resources/Vpc/FlowLog" } ] } @@ -1149,7 +1149,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "faropn-new-resources/Vpc/FlowLog" } ] }, @@ -1186,7 +1186,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "faropn-new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1199,7 +1199,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRAPIsecuritygroupE52BAE3F", + "faropnnewresourcesECRAPIsecuritygroup518CB3F4", "GroupId" ] } @@ -1229,7 +1229,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRDKRsecuritygroupBA34F94F", + "faropnnewresourcesECRDKRsecuritygroup12106D60", "GroupId" ] } @@ -1293,10 +1293,10 @@ } } }, - "newresourcesECRAPIsecuritygroupE52BAE3F": { + "faropnnewresourcesECRAPIsecuritygroup518CB3F4": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_API-security-group", + "GroupDescription": "faropn-new-resources/faropn-new-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1351,10 +1351,10 @@ } } }, - "newresourcesECRDKRsecuritygroupBA34F94F": { + "faropnnewresourcesECRDKRsecuritygroup12106D60": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_DKR-security-group", + "GroupDescription": "faropn-new-resources/faropn-new-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1458,7 +1458,7 @@ } ], "Cpu": "256", - "Family": "newresourcestestconstructtaskdefE4616A0D", + "Family": "faropnnewresourcestestconstructtaskdefA180857F", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-new-resources.ts similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-new-resources.ts index 864905f47..916c87b7c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.new-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-opensearch/test/integ.faropn-new-resources.ts @@ -31,7 +31,7 @@ const testProps: FargateToOpenSearchProps = { containerDefinitionProps: { image }, - openSearchDomainName: 'solution-constructs', + openSearchDomainName: `${generateIntegStackName(__filename)}`, }; new FargateToOpenSearch(stack, 'test-construct', testProps); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-existing-resources.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-existing-resources.expected.json index 60e51ad86..adf6b6827 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-existing-resources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "fars3-existing-resources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "fars3-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "fars3-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "fars3-existing-resources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "fars3-existing-resources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "fars3-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "fars3-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "fars3-existing-resources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "fars3-existing-resources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "fars3-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "fars3-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "fars3-existing-resources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "fars3-existing-resources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "fars3-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "fars3-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "fars3-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "fars3-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "fars3-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "fars3-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "fars3-existing-resources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "fars3-existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "fars3-existing-resources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "fars3-existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRAPIsecuritygroup78294485", + "fars3existingresourcesECRAPIsecuritygroup62B31B6C", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRDKRsecuritygroup598BA37E", + "fars3existingresourcesECRDKRsecuritygroupDA08F372", "GroupId" ] } @@ -824,6 +824,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -913,7 +914,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -960,10 +961,10 @@ } } }, - "existingresourcesECRAPIsecuritygroup78294485": { + "fars3existingresourcesECRAPIsecuritygroup62B31B6C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_API-security-group", + "GroupDescription": "fars3-existing-resources/fars3-existing-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1018,10 +1019,10 @@ } } }, - "existingresourcesECRDKRsecuritygroup598BA37E": { + "fars3existingresourcesECRDKRsecuritygroupDA08F372": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_DKR-security-group", + "GroupDescription": "fars3-existing-resources/fars3-existing-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1225,7 +1226,7 @@ } ], "Cpu": "256", - "Family": "existingresourcestesttaskdef88B214A2", + "Family": "fars3existingresourcestesttaskdef84DD1421", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-existing-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.existing-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-existing-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.expected.json index df29641ff..aab3d48e4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.expected.json @@ -212,6 +212,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -282,7 +283,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "fars3-new-resources/Vpc" } ] } @@ -304,7 +305,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "fars3-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -328,7 +329,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "fars3-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -369,7 +370,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "fars3-new-resources/Vpc/PublicSubnet1" } ] } @@ -389,7 +390,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "fars3-new-resources/Vpc/PublicSubnet1" } ] }, @@ -415,7 +416,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "fars3-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -439,7 +440,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "fars3-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -480,7 +481,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "fars3-new-resources/Vpc/PublicSubnet2" } ] } @@ -500,7 +501,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "fars3-new-resources/Vpc/PublicSubnet2" } ] }, @@ -526,7 +527,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "fars3-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -550,7 +551,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "fars3-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -591,7 +592,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "fars3-new-resources/Vpc/PublicSubnet3" } ] } @@ -611,7 +612,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "fars3-new-resources/Vpc/PublicSubnet3" } ] }, @@ -637,7 +638,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "fars3-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -651,7 +652,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "fars3-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -699,7 +700,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "fars3-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -713,7 +714,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "fars3-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -761,7 +762,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "fars3-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -775,7 +776,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "fars3-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -812,7 +813,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "fars3-new-resources/Vpc" } ] } @@ -846,7 +847,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "fars3-new-resources/Vpc/FlowLog" } ] } @@ -898,7 +899,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "fars3-new-resources/Vpc/FlowLog" } ] }, @@ -935,7 +936,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "fars3-new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -989,7 +990,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRAPIsecuritygroupE52BAE3F", + "fars3newresourcesECRAPIsecuritygroupD131A26F", "GroupId" ] } @@ -1019,7 +1020,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRDKRsecuritygroupBA34F94F", + "fars3newresourcesECRDKRsecuritygroupEB0E4C34", "GroupId" ] } @@ -1042,10 +1043,10 @@ } } }, - "newresourcesECRAPIsecuritygroupE52BAE3F": { + "fars3newresourcesECRAPIsecuritygroupD131A26F": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_API-security-group", + "GroupDescription": "fars3-new-resources/fars3-new-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1100,10 +1101,10 @@ } } }, - "newresourcesECRDKRsecuritygroupBA34F94F": { + "fars3newresourcesECRDKRsecuritygroupEB0E4C34": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_DKR-security-group", + "GroupDescription": "fars3-new-resources/fars3-new-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1262,7 +1263,7 @@ } ], "Cpu": "256", - "Family": "newresourcestestconstructtaskdefE4616A0D", + "Family": "fars3newresourcestestconstructtaskdef85494902", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1387,7 +1388,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.new-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-existing-resources.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-existing-resources.expected.json index 9355051e6..1e206557a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-existing-resources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farsec-existing-resources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsec-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsec-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsec-existing-resources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsec-existing-resources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsec-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsec-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsec-existing-resources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsec-existing-resources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsec-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsec-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsec-existing-resources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsec-existing-resources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farsec-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farsec-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farsec-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farsec-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farsec-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farsec-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farsec-existing-resources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farsec-existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farsec-existing-resources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farsec-existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRAPIsecuritygroup78294485", + "farsecexistingresourcesECRAPIsecuritygroupC53896E0", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRDKRsecuritygroup598BA37E", + "farsecexistingresourcesECRDKRsecuritygroupF8F7815B", "GroupId" ] } @@ -778,7 +778,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesSECRETSMANAGERsecuritygroup8010FC5B", + "farsecexistingresourcesSECRETSMANAGERsecuritygroup6E143135", "GroupId" ] } @@ -819,10 +819,10 @@ } } }, - "existingresourcesECRAPIsecuritygroup78294485": { + "farsecexistingresourcesECRAPIsecuritygroupC53896E0": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_API-security-group", + "GroupDescription": "farsec-existing-resources/farsec-existing-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -877,10 +877,10 @@ } } }, - "existingresourcesECRDKRsecuritygroup598BA37E": { + "farsecexistingresourcesECRDKRsecuritygroupF8F7815B": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_DKR-security-group", + "GroupDescription": "farsec-existing-resources/farsec-existing-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1007,7 +1007,7 @@ } ], "Cpu": "256", - "Family": "existingresourcestesttaskdef88B214A2", + "Family": "farsecexistingresourcestesttaskdefDDA81A95", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1103,10 +1103,10 @@ "testtaskdefTaskRoleB2DEF113" ] }, - "existingresourcesSECRETSMANAGERsecuritygroup8010FC5B": { + "farsecexistingresourcesSECRETSMANAGERsecuritygroup6E143135": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-SECRETS_MANAGER-security-group", + "GroupDescription": "farsec-existing-resources/farsec-existing-resources-SECRETS_MANAGER-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-existing-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.existing-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-existing-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-new-resources.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.new-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-new-resources.expected.json index f893bb048..df696de8b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-new-resources.expected.json @@ -29,7 +29,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farsec-new-resources/Vpc" } ] } @@ -51,7 +51,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsec-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -75,7 +75,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsec-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -116,7 +116,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsec-new-resources/Vpc/PublicSubnet1" } ] } @@ -136,7 +136,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsec-new-resources/Vpc/PublicSubnet1" } ] }, @@ -162,7 +162,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsec-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -186,7 +186,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsec-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -227,7 +227,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsec-new-resources/Vpc/PublicSubnet2" } ] } @@ -247,7 +247,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsec-new-resources/Vpc/PublicSubnet2" } ] }, @@ -273,7 +273,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsec-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -297,7 +297,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsec-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -338,7 +338,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsec-new-resources/Vpc/PublicSubnet3" } ] } @@ -358,7 +358,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsec-new-resources/Vpc/PublicSubnet3" } ] }, @@ -384,7 +384,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farsec-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -398,7 +398,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farsec-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -446,7 +446,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farsec-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -460,7 +460,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farsec-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -508,7 +508,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farsec-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -522,7 +522,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farsec-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -559,7 +559,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farsec-new-resources/Vpc" } ] } @@ -593,7 +593,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farsec-new-resources/Vpc/FlowLog" } ] } @@ -645,7 +645,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farsec-new-resources/Vpc/FlowLog" } ] }, @@ -682,7 +682,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farsec-new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -695,7 +695,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesSECRETSMANAGERsecuritygroupD22DA6BC", + "farsecnewresourcesSECRETSMANAGERsecuritygroup34AF6546", "GroupId" ] } @@ -725,7 +725,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRAPIsecuritygroupE52BAE3F", + "farsecnewresourcesECRAPIsecuritygroupBD14F246", "GroupId" ] } @@ -755,7 +755,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRDKRsecuritygroupBA34F94F", + "farsecnewresourcesECRDKRsecuritygroupB185D03F", "GroupId" ] } @@ -819,10 +819,10 @@ } } }, - "newresourcesSECRETSMANAGERsecuritygroupD22DA6BC": { + "farsecnewresourcesSECRETSMANAGERsecuritygroup34AF6546": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-SECRETS_MANAGER-security-group", + "GroupDescription": "farsec-new-resources/farsec-new-resources-SECRETS_MANAGER-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -877,10 +877,10 @@ } } }, - "newresourcesECRAPIsecuritygroupE52BAE3F": { + "farsecnewresourcesECRAPIsecuritygroupBD14F246": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_API-security-group", + "GroupDescription": "farsec-new-resources/farsec-new-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -935,10 +935,10 @@ } } }, - "newresourcesECRDKRsecuritygroupBA34F94F": { + "farsecnewresourcesECRDKRsecuritygroupB185D03F": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_DKR-security-group", + "GroupDescription": "farsec-new-resources/farsec-new-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1075,7 +1075,7 @@ } ], "Cpu": "256", - "Family": "newresourcestestconstructtaskdefE4616A0D", + "Family": "farsecnewresourcestestconstructtaskdef92BB4D49", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-new-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.new-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-secretsmanager/test/integ.farsec-new-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-existing-resources.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-existing-resources.expected.json index 1f5c9d097..7b77dcf23 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-existing-resources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farsns-existing-resources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsns-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsns-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsns-existing-resources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsns-existing-resources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsns-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsns-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsns-existing-resources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsns-existing-resources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsns-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsns-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsns-existing-resources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsns-existing-resources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farsns-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farsns-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farsns-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farsns-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farsns-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farsns-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farsns-existing-resources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farsns-existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farsns-existing-resources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farsns-existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRAPIsecuritygroup78294485", + "farsnsexistingresourcesECRAPIsecuritygroup5505C2BB", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRDKRsecuritygroup598BA37E", + "farsnsexistingresourcesECRDKRsecuritygroupEB894942", "GroupId" ] } @@ -778,7 +778,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesSNSsecuritygroup2696BE98", + "farsnsexistingresourcesSNSsecuritygroupAD8D8BB6", "GroupId" ] } @@ -814,10 +814,10 @@ } } }, - "existingresourcesECRAPIsecuritygroup78294485": { + "farsnsexistingresourcesECRAPIsecuritygroup5505C2BB": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_API-security-group", + "GroupDescription": "farsns-existing-resources/farsns-existing-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -872,10 +872,10 @@ } } }, - "existingresourcesECRDKRsecuritygroup598BA37E": { + "farsnsexistingresourcesECRDKRsecuritygroupEB894942": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_DKR-security-group", + "GroupDescription": "farsns-existing-resources/farsns-existing-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1008,7 +1008,7 @@ } ], "Cpu": "256", - "Family": "existingresourcestesttaskdef88B214A2", + "Family": "farsnsexistingresourcestesttaskdef28AC3B24", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1104,10 +1104,10 @@ "testtaskdefTaskRoleB2DEF113" ] }, - "existingresourcesSNSsecuritygroup2696BE98": { + "farsnsexistingresourcesSNSsecuritygroupAD8D8BB6": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-SNS-security-group", + "GroupDescription": "farsns-existing-resources/farsns-existing-resources-SNS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-existing-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.existing-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-existing-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-new-resources.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.new-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-new-resources.expected.json index ee0a2e6b2..a48048163 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-new-resources.expected.json @@ -116,7 +116,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farsns-new-resources/Vpc" } ] } @@ -138,7 +138,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsns-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -162,7 +162,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsns-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -203,7 +203,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsns-new-resources/Vpc/PublicSubnet1" } ] } @@ -223,7 +223,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsns-new-resources/Vpc/PublicSubnet1" } ] }, @@ -249,7 +249,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsns-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -273,7 +273,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsns-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -314,7 +314,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsns-new-resources/Vpc/PublicSubnet2" } ] } @@ -334,7 +334,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsns-new-resources/Vpc/PublicSubnet2" } ] }, @@ -360,7 +360,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsns-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -384,7 +384,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsns-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -425,7 +425,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsns-new-resources/Vpc/PublicSubnet3" } ] } @@ -445,7 +445,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsns-new-resources/Vpc/PublicSubnet3" } ] }, @@ -471,7 +471,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farsns-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -485,7 +485,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farsns-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -533,7 +533,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farsns-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -547,7 +547,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farsns-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -595,7 +595,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farsns-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -609,7 +609,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farsns-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -646,7 +646,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farsns-new-resources/Vpc" } ] } @@ -680,7 +680,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farsns-new-resources/Vpc/FlowLog" } ] } @@ -732,7 +732,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farsns-new-resources/Vpc/FlowLog" } ] }, @@ -769,7 +769,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farsns-new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -782,7 +782,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesSNSsecuritygroup4422F7B8", + "farsnsnewresourcesSNSsecuritygroup3AD224ED", "GroupId" ] } @@ -812,7 +812,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRAPIsecuritygroupE52BAE3F", + "farsnsnewresourcesECRAPIsecuritygroup7385C115", "GroupId" ] } @@ -842,7 +842,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRDKRsecuritygroupBA34F94F", + "farsnsnewresourcesECRDKRsecuritygroup4A4713E3", "GroupId" ] } @@ -906,10 +906,10 @@ } } }, - "newresourcesSNSsecuritygroup4422F7B8": { + "farsnsnewresourcesSNSsecuritygroup3AD224ED": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-SNS-security-group", + "GroupDescription": "farsns-new-resources/farsns-new-resources-SNS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -964,10 +964,10 @@ } } }, - "newresourcesECRAPIsecuritygroupE52BAE3F": { + "farsnsnewresourcesECRAPIsecuritygroup7385C115": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_API-security-group", + "GroupDescription": "farsns-new-resources/farsns-new-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1022,10 +1022,10 @@ } } }, - "newresourcesECRDKRsecuritygroupBA34F94F": { + "farsnsnewresourcesECRDKRsecuritygroup4A4713E3": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_DKR-security-group", + "GroupDescription": "farsns-new-resources/farsns-new-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1158,7 +1158,7 @@ } ], "Cpu": "256", - "Family": "newresourcestestconstructtaskdefE4616A0D", + "Family": "farsnsnewresourcestestconstructtaskdef6E33E3AB", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-new-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.new-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-sns/test/integ.farsns-new-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-existing-resources.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-existing-resources.expected.json index 3e6aae42c..c239e5791 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-existing-resources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farsqs-existing-resources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farsqs-existing-resources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farsqs-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farsqs-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farsqs-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farsqs-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farsqs-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farsqs-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farsqs-existing-resources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farsqs-existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farsqs-existing-resources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farsqs-existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRAPIsecuritygroup78294485", + "farsqsexistingresourcesECRAPIsecuritygroupBDA6C0CF", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRDKRsecuritygroup598BA37E", + "farsqsexistingresourcesECRDKRsecuritygroup002DCA16", "GroupId" ] } @@ -778,7 +778,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesSQSsecuritygroup0C9178B2", + "farsqsexistingresourcesSQSsecuritygroup5F0F5188", "GroupId" ] } @@ -810,10 +810,10 @@ "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" }, - "existingresourcesECRAPIsecuritygroup78294485": { + "farsqsexistingresourcesECRAPIsecuritygroupBDA6C0CF": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_API-security-group", + "GroupDescription": "farsqs-existing-resources/farsqs-existing-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -868,10 +868,10 @@ } } }, - "existingresourcesECRDKRsecuritygroup598BA37E": { + "farsqsexistingresourcesECRDKRsecuritygroup002DCA16": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_DKR-security-group", + "GroupDescription": "farsqs-existing-resources/farsqs-existing-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1027,7 +1027,7 @@ } ], "Cpu": "256", - "Family": "existingresourcestesttaskdef88B214A2", + "Family": "farsqsexistingresourcestesttaskdef5378145E", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1123,10 +1123,10 @@ "testtaskdefTaskRoleB2DEF113" ] }, - "existingresourcesSQSsecuritygroup0C9178B2": { + "farsqsexistingresourcesSQSsecuritygroup5F0F5188": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-SQS-security-group", + "GroupDescription": "farsqs-existing-resources/farsqs-existing-resources-SQS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-existing-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.existing-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-existing-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-new-resources.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.new-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-new-resources.expected.json index b2fe8831d..f695ef797 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-new-resources.expected.json @@ -91,7 +91,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farsqs-new-resources/Vpc" } ] } @@ -113,7 +113,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsqs-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -137,7 +137,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsqs-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -178,7 +178,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsqs-new-resources/Vpc/PublicSubnet1" } ] } @@ -198,7 +198,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farsqs-new-resources/Vpc/PublicSubnet1" } ] }, @@ -224,7 +224,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsqs-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -248,7 +248,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsqs-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -289,7 +289,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsqs-new-resources/Vpc/PublicSubnet2" } ] } @@ -309,7 +309,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farsqs-new-resources/Vpc/PublicSubnet2" } ] }, @@ -335,7 +335,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsqs-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -359,7 +359,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsqs-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -400,7 +400,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsqs-new-resources/Vpc/PublicSubnet3" } ] } @@ -420,7 +420,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farsqs-new-resources/Vpc/PublicSubnet3" } ] }, @@ -446,7 +446,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farsqs-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -460,7 +460,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farsqs-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -508,7 +508,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farsqs-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -522,7 +522,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farsqs-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -570,7 +570,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farsqs-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -584,7 +584,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farsqs-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -621,7 +621,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farsqs-new-resources/Vpc" } ] } @@ -655,7 +655,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farsqs-new-resources/Vpc/FlowLog" } ] } @@ -707,7 +707,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farsqs-new-resources/Vpc/FlowLog" } ] }, @@ -744,7 +744,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farsqs-new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -757,7 +757,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesSQSsecuritygroup1D95FDB1", + "farsqsnewresourcesSQSsecuritygroup0DC24AA4", "GroupId" ] } @@ -787,7 +787,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRAPIsecuritygroupE52BAE3F", + "farsqsnewresourcesECRAPIsecuritygroup878D9CD4", "GroupId" ] } @@ -817,7 +817,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRDKRsecuritygroupBA34F94F", + "farsqsnewresourcesECRDKRsecuritygroupBEF9541D", "GroupId" ] } @@ -881,10 +881,10 @@ } } }, - "newresourcesSQSsecuritygroup1D95FDB1": { + "farsqsnewresourcesSQSsecuritygroup0DC24AA4": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-SQS-security-group", + "GroupDescription": "farsqs-new-resources/farsqs-new-resources-SQS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -939,10 +939,10 @@ } } }, - "newresourcesECRAPIsecuritygroupE52BAE3F": { + "farsqsnewresourcesECRAPIsecuritygroup878D9CD4": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_API-security-group", + "GroupDescription": "farsqs-new-resources/farsqs-new-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -997,10 +997,10 @@ } } }, - "newresourcesECRDKRsecuritygroupBA34F94F": { + "farsqsnewresourcesECRDKRsecuritygroupBEF9541D": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_DKR-security-group", + "GroupDescription": "farsqs-new-resources/farsqs-new-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1140,7 +1140,7 @@ } ], "Cpu": "256", - "Family": "newresourcestestconstructtaskdefE4616A0D", + "Family": "farsqsnewresourcestestconstructtaskdefA4068A25", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-new-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.new-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-sqs/test/integ.farsqs-new-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-existing-resources.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-existing-resources.expected.json index a02651ced..176e69118 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-existing-resources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farssm-existing-resources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farssm-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farssm-existing-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farssm-existing-resources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet1" + "Value": "farssm-existing-resources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farssm-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farssm-existing-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farssm-existing-resources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet2" + "Value": "farssm-existing-resources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farssm-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farssm-existing-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farssm-existing-resources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PublicSubnet3" + "Value": "farssm-existing-resources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farssm-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet1" + "Value": "farssm-existing-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farssm-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet2" + "Value": "farssm-existing-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farssm-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/PrivateSubnet3" + "Value": "farssm-existing-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc" + "Value": "farssm-existing-resources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farssm-existing-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farssm-existing-resources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-resources/Vpc/FlowLog" + "Value": "farssm-existing-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRAPIsecuritygroup78294485", + "farssmexistingresourcesECRAPIsecuritygroupCE2D79D9", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesECRDKRsecuritygroup598BA37E", + "farssmexistingresourcesECRDKRsecuritygroup966112D7", "GroupId" ] } @@ -778,7 +778,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingresourcesSSMsecuritygroup5CE82B38", + "farssmexistingresourcesSSMsecuritygroup12F6DFE9", "GroupId" ] } @@ -811,10 +811,10 @@ "Value": "Foo" } }, - "existingresourcesECRAPIsecuritygroup78294485": { + "farssmexistingresourcesECRAPIsecuritygroupCE2D79D9": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_API-security-group", + "GroupDescription": "farssm-existing-resources/farssm-existing-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -869,10 +869,10 @@ } } }, - "existingresourcesECRDKRsecuritygroup598BA37E": { + "farssmexistingresourcesECRDKRsecuritygroup966112D7": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-ECR_DKR-security-group", + "GroupDescription": "farssm-existing-resources/farssm-existing-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1040,7 +1040,7 @@ } ], "Cpu": "256", - "Family": "existingresourcestesttaskdef88B214A2", + "Family": "farssmexistingresourcestesttaskdef1F702A7D", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1136,10 +1136,10 @@ "testtaskdefTaskRoleB2DEF113" ] }, - "existingresourcesSSMsecuritygroup5CE82B38": { + "farssmexistingresourcesSSMsecuritygroup12F6DFE9": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-resources/existing-resources-SSM-security-group", + "GroupDescription": "farssm-existing-resources/farssm-existing-resources-SSM-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-existing-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.existing-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-existing-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-new-resources.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.new-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-new-resources.expected.json index 8b5a629be..d958f5906 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-new-resources.expected.json @@ -19,7 +19,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farssm-new-resources/Vpc" } ] } @@ -41,7 +41,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farssm-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -65,7 +65,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farssm-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -106,7 +106,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farssm-new-resources/Vpc/PublicSubnet1" } ] } @@ -126,7 +126,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farssm-new-resources/Vpc/PublicSubnet1" } ] }, @@ -152,7 +152,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farssm-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -176,7 +176,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farssm-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -217,7 +217,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farssm-new-resources/Vpc/PublicSubnet2" } ] } @@ -237,7 +237,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farssm-new-resources/Vpc/PublicSubnet2" } ] }, @@ -263,7 +263,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farssm-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -287,7 +287,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farssm-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -328,7 +328,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farssm-new-resources/Vpc/PublicSubnet3" } ] } @@ -348,7 +348,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farssm-new-resources/Vpc/PublicSubnet3" } ] }, @@ -374,7 +374,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farssm-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -388,7 +388,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farssm-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -436,7 +436,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farssm-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -450,7 +450,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farssm-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -498,7 +498,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farssm-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -512,7 +512,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farssm-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -549,7 +549,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farssm-new-resources/Vpc" } ] } @@ -583,7 +583,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farssm-new-resources/Vpc/FlowLog" } ] } @@ -635,7 +635,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farssm-new-resources/Vpc/FlowLog" } ] }, @@ -672,7 +672,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farssm-new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -685,7 +685,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesSSMsecuritygroupBA8A3B0D", + "farssmnewresourcesSSMsecuritygroup972ACD83", "GroupId" ] } @@ -715,7 +715,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRAPIsecuritygroupE52BAE3F", + "farssmnewresourcesECRAPIsecuritygroup2AD84172", "GroupId" ] } @@ -745,7 +745,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRDKRsecuritygroupBA34F94F", + "farssmnewresourcesECRDKRsecuritygroupC6E70ADA", "GroupId" ] } @@ -809,10 +809,10 @@ } } }, - "newresourcesSSMsecuritygroupBA8A3B0D": { + "farssmnewresourcesSSMsecuritygroup972ACD83": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-SSM-security-group", + "GroupDescription": "farssm-new-resources/farssm-new-resources-SSM-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -867,10 +867,10 @@ } } }, - "newresourcesECRAPIsecuritygroupE52BAE3F": { + "farssmnewresourcesECRAPIsecuritygroup2AD84172": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_API-security-group", + "GroupDescription": "farssm-new-resources/farssm-new-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -925,10 +925,10 @@ } } }, - "newresourcesECRDKRsecuritygroupBA34F94F": { + "farssmnewresourcesECRDKRsecuritygroupC6E70ADA": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_DKR-security-group", + "GroupDescription": "farssm-new-resources/farssm-new-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1073,7 +1073,7 @@ } ], "Cpu": "256", - "Family": "newresourcestestconstructtaskdefE4616A0D", + "Family": "farssmnewresourcestestconstructtaskdef38E6FA0E", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-new-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.new-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-ssmstringparameter/test/integ.farssm-new-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-new-resources.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-new-resources.expected.json index b220c2404..896457618 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-new-resources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farstp-new-resources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farstp-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farstp-new-resources/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farstp-new-resources/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet1" + "Value": "farstp-new-resources/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farstp-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farstp-new-resources/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farstp-new-resources/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet2" + "Value": "farstp-new-resources/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farstp-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farstp-new-resources/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farstp-new-resources/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PublicSubnet3" + "Value": "farstp-new-resources/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farstp-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet1" + "Value": "farstp-new-resources/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farstp-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet2" + "Value": "farstp-new-resources/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farstp-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/PrivateSubnet3" + "Value": "farstp-new-resources/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc" + "Value": "farstp-new-resources/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farstp-new-resources/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farstp-new-resources/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-resources/Vpc/FlowLog" + "Value": "farstp-new-resources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRAPIsecuritygroupE52BAE3F", + "farstpnewresourcesECRAPIsecuritygroup378EBA64", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesECRDKRsecuritygroupBA34F94F", + "farstpnewresourcesECRDKRsecuritygroup6175912D", "GroupId" ] } @@ -778,7 +778,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newresourcesSTEPFUNCTIONSsecuritygroupFB5E4F76", + "farstpnewresourcesSTEPFUNCTIONSsecuritygroup05F71CC8", "GroupId" ] } @@ -801,10 +801,10 @@ } } }, - "newresourcesECRAPIsecuritygroupE52BAE3F": { + "farstpnewresourcesECRAPIsecuritygroup378EBA64": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_API-security-group", + "GroupDescription": "farstp-new-resources/farstp-new-resources-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -859,10 +859,10 @@ } } }, - "newresourcesECRDKRsecuritygroupBA34F94F": { + "farstpnewresourcesECRDKRsecuritygroup6175912D": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-ECR_DKR-security-group", + "GroupDescription": "farstp-new-resources/farstp-new-resources-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -986,7 +986,7 @@ } ], "Cpu": "256", - "Family": "newresourcestesttaskdef75720C83", + "Family": "farstpnewresourcestesttaskdefAC23A4B2", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1089,7 +1089,7 @@ "Fn::Join": [ "", [ - "/aws/vendedlogs/states/constructs/new-resourcestest-constructStateMachineLog-", + "/aws/vendedlogs/states/constructs/farstp-new-resourcestest-constructStateMachineLog-", { "Fn::Select": [ 2, @@ -1302,10 +1302,10 @@ "Threshold": 1 } }, - "newresourcesSTEPFUNCTIONSsecuritygroupFB5E4F76": { + "farstpnewresourcesSTEPFUNCTIONSsecuritygroup05F71CC8": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-resources/new-resources-STEP_FUNCTIONS-security-group", + "GroupDescription": "farstp-new-resources/farstp-new-resources-STEP_FUNCTIONS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-new-resources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.new-resources.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-new-resources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.expected.json rename to source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.expected.json index 2d6f8627b..86cfc4810 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc" + "Value": "farstp-no-cloudwatch-alarms/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet1" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet1" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet1" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet1" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet2" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet2" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet2" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet2" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet3" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet3" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet3" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PublicSubnet3" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet1" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet1" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet2" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet2" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet3" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/PrivateSubnet3" + "Value": "farstp-no-cloudwatch-alarms/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc" + "Value": "farstp-no-cloudwatch-alarms/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/FlowLog" + "Value": "farstp-no-cloudwatch-alarms/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/FlowLog" + "Value": "farstp-no-cloudwatch-alarms/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-cloudwatch-alarms/Vpc/FlowLog" + "Value": "farstp-no-cloudwatch-alarms/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "nocloudwatchalarmsECRAPIsecuritygroupA72029F8", + "farstpnocloudwatchalarmsECRAPIsecuritygroup82DA60D3", "GroupId" ] } @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "nocloudwatchalarmsECRDKRsecuritygroup11863825", + "farstpnocloudwatchalarmsECRDKRsecuritygroup230C35AF", "GroupId" ] } @@ -778,7 +778,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "nocloudwatchalarmsSTEPFUNCTIONSsecuritygroupE67433DC", + "farstpnocloudwatchalarmsSTEPFUNCTIONSsecuritygroup08C40421", "GroupId" ] } @@ -801,10 +801,10 @@ } } }, - "nocloudwatchalarmsECRAPIsecuritygroupA72029F8": { + "farstpnocloudwatchalarmsECRAPIsecuritygroup82DA60D3": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "no-cloudwatch-alarms/no-cloudwatch-alarms-ECR_API-security-group", + "GroupDescription": "farstp-no-cloudwatch-alarms/farstp-no-cloudwatch-alarms-ECR_API-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -859,10 +859,10 @@ } } }, - "nocloudwatchalarmsECRDKRsecuritygroup11863825": { + "farstpnocloudwatchalarmsECRDKRsecuritygroup230C35AF": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "no-cloudwatch-alarms/no-cloudwatch-alarms-ECR_DKR-security-group", + "GroupDescription": "farstp-no-cloudwatch-alarms/farstp-no-cloudwatch-alarms-ECR_DKR-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -986,7 +986,7 @@ } ], "Cpu": "256", - "Family": "nocloudwatchalarmstesttaskdef18D90B7C", + "Family": "farstpnocloudwatchalarmstesttaskdef4B93DE32", "Memory": "512", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ @@ -1219,10 +1219,10 @@ "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" }, - "nocloudwatchalarmsSTEPFUNCTIONSsecuritygroupE67433DC": { + "farstpnocloudwatchalarmsSTEPFUNCTIONSsecuritygroup08C40421": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "no-cloudwatch-alarms/no-cloudwatch-alarms-STEP_FUNCTIONS-security-group", + "GroupDescription": "farstp-no-cloudwatch-alarms/farstp-no-cloudwatch-alarms-STEP_FUNCTIONS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.no-cloudwatch-alarms.ts rename to source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json similarity index 79% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json index f141a4769..ae4b54e2f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json @@ -19,6 +19,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -78,6 +84,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testiotkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket03F0BA8E", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testiotkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket03F0BA8E", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -119,6 +164,25 @@ } } }, + "testiotkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketAutoDeleteObjectsCustomResourceF627CC0C": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testiotkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket03F0BA8E" + } + }, + "DependsOn": [ + "testiotkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketPolicyCCE58825" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testiotkinesisfirehoses3KinesisFirehoseToS3S3BucketAEE2D91B": { "Type": "AWS::S3::Bucket", "Properties": { @@ -341,7 +405,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosecustomLoggingBuckoses3KinesisFirehoseToS356855CD4", + "DeliveryStreamName": "KinesisFirehoseiotfhss3customLogoses3KinesisFirehoseToS3841E0830", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -463,6 +527,64 @@ "Sql": "SELECT * FROM 'connectedcar/telemetry/#'" } } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "testiotkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket03F0BA8E" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts index 7fac7082a..6a797d62a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts @@ -36,6 +36,7 @@ new IotToKinesisFirehoseToS3(stack, 'test-iot-kinesisfirehose-s3', { }, loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, bucketName: 'custom-logging-bucket', encryption: BucketEncryption.S3_MANAGED, versioned: true diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.expected.json index b1b5c1364..394bd18c2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.expected.json @@ -341,7 +341,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosenoargumentstestiooses3KinesisFirehoseToS300C2E381", + "DeliveryStreamName": "KinesisFirehoseiotfhss3noargumenoses3KinesisFirehoseToS31B695E75", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.noLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.noLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.expected.json index b326c655f..93b903875 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.noLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.expected.json @@ -227,7 +227,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosenoLoggingBucketteoses3KinesisFirehoseToS3D5D4755A", + "DeliveryStreamName": "KinesisFirehoseiotfhss3noLoggingoses3KinesisFirehoseToS3C179A840", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.noLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.noLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.existing-kinesisstream.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-existing-kinesisstream.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.existing-kinesisstream.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-existing-kinesisstream.expected.json index 2486dfc92..0951a2607 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.existing-kinesisstream.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-existing-kinesisstream.expected.json @@ -83,9 +83,9 @@ "testiotkinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmD446A9D0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -96,9 +96,9 @@ "testiotkinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm45349C37": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.existing-kinesisstream.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-existing-kinesisstream.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.existing-kinesisstream.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-existing-kinesisstream.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.new-kinesisstream.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-new-kinesisstream.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.new-kinesisstream.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-new-kinesisstream.expected.json index c2e180e81..f7d69c29d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.new-kinesisstream.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-new-kinesisstream.expected.json @@ -83,9 +83,9 @@ "testiotkinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmD446A9D0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -96,9 +96,9 @@ "testiotkinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm45349C37": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.new-kinesisstream.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-new-kinesisstream.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.new-kinesisstream.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-new-kinesisstream.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-no-arguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-no-arguments.expected.json index cecdc54ec..d0c8687a9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-no-arguments.expected.json @@ -83,9 +83,9 @@ "testiotkinesisstreamsKinesisStreamGetRecordsIteratorAgeAlarmD446A9D0": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Record Processing Falling Behind, there is risk for data loss due to record expiration.", "MetricName": "GetRecords.IteratorAgeMilliseconds", "Namespace": "AWS/Kinesis", "Period": 300, @@ -96,9 +96,9 @@ "testiotkinesisstreamsKinesisStreamReadProvisionedThroughputExceededAlarm45349C37": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Consumer Application is Reading at a Slower Rate Than Expected.", "MetricName": "ReadProvisionedThroughputExceeded", "Namespace": "AWS/Kinesis", "Period": 300, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-kinesisstreams/test/integ.iotkin-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iotlamddb-iot-lambda-dynamodb.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iotlamddb-iot-lambda-dynamodb.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iotlamddb-iot-lambda-dynamodb.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iot-lambda-dynamodb.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iotlamddb-iot-lambda-dynamodb.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iotlamddb-with-vpc.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iotlamddb-with-vpc.expected.json index 5b46748dc..e862fd194 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iotlamddb-with-vpc.expected.json @@ -131,7 +131,7 @@ "testiotlambdadynamodbstackLambdaToDynamoDBReplaceDefaultSecurityGroupsecuritygroup7D851D3B": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "with-vpc/test-iot-lambda-dynamodb-stack/LambdaToDynamoDB/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/LambdaToDynamoDB/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -294,7 +294,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc" } ] } @@ -316,7 +316,7 @@ }, { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet1" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -330,7 +330,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet1" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet2" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet2" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -416,7 +416,7 @@ }, { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet3" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -430,7 +430,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet3" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -467,7 +467,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/FlowLog" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc/FlowLog" } ] } @@ -519,7 +519,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/FlowLog" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc/FlowLog" } ] }, @@ -556,7 +556,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/test-iot-lambda-dynamodb-stack/Vpc/FlowLog" + "Value": "iotlamddb-with-vpc/test-iot-lambda-dynamodb-stack/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iotlamddb-with-vpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.with-vpc.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-lambda-dynamodb/test/integ.iotlamddb-with-vpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iotlam-iot-lambda-new-func.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iotlam-iot-lambda-new-func.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iotlam-iot-lambda-new-func.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-new-func.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iotlam-iot-lambda-new-func.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iotlam-iot-lambda-use-existing-func.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iotlam-iot-lambda-use-existing-func.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.ts b/source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iotlam-iot-lambda-use-existing-func.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iot-lambda-use-existing-func.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-lambda/test/integ.iotlam-iot-lambda-use-existing-func.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-defaultprops.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-defaultprops.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-defaultprops.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-defaultprops.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-defaultprops.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-defaultprops.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-defaultprops.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-defaultprops.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-existing-bucket.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-existing-bucket.expected.json index 423e55a0f..5b981057c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-existing-bucket.expected.json @@ -53,6 +53,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -142,7 +143,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-existing-bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-existing-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-existing-bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.expected.json similarity index 75% rename from source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.expected.json index c447bea63..1bf94a133 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.expected.json @@ -54,6 +54,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -113,6 +119,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testiots3integrationS3LoggingBucket606446CC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testiots3integrationS3LoggingBucket606446CC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -154,6 +199,25 @@ } } }, + "testiots3integrationS3LoggingBucketAutoDeleteObjectsCustomResource98F8BDFE": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testiots3integrationS3LoggingBucket606446CC" + } + }, + "DependsOn": [ + "testiots3integrationS3LoggingBucketPolicy2DB45D12" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testiots3integrationS3Bucket9B8B180C": { "Type": "AWS::S3::Bucket", "Properties": { @@ -371,6 +435,64 @@ "Sql": "SELECT * FROM 'solutions/constructs'" } } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "testiots3integrationS3LoggingBucket606446CC" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.ts similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.ts index 97cb13dfa..bc414640e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iot-s3-new-encrypted-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.ts @@ -41,6 +41,7 @@ const props: IotToS3Props = { }, loggingBucketProps: { encryption: BucketEncryption.KMS_MANAGED, + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY } }; diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.custom-max-receive-count.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-custom-max-receive-count.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.custom-max-receive-count.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-custom-max-receive-count.expected.json index 2b7d9b0de..ffd86de4a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.custom-max-receive-count.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-custom-max-receive-count.expected.json @@ -84,6 +84,7 @@ "testiotsqsstackEncryptionKeyAB09201B": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -137,8 +138,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.custom-max-receive-count.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-custom-max-receive-count.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.custom-max-receive-count.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-custom-max-receive-count.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.dead-letter-queue-off.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-dead-letter-queue-off.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.dead-letter-queue-off.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-dead-letter-queue-off.expected.json index c4721aa34..601118de3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.dead-letter-queue-off.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-dead-letter-queue-off.expected.json @@ -4,6 +4,7 @@ "testiotsqsstackEncryptionKeyAB09201B": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -57,8 +58,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.dead-letter-queue-off.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-dead-letter-queue-off.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.dead-letter-queue-off.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-dead-letter-queue-off.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.default-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-default-arguments.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.default-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-default-arguments.expected.json index dbd77e6aa..85ce627f5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.default-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-default-arguments.expected.json @@ -83,6 +83,7 @@ "testiotsqsstackEncryptionKeyAB09201B": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -136,8 +137,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.default-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-default-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.default-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-default-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.existing-queue.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-existing-queue.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.existing-queue.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-existing-queue.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.existing-queue.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-existing-queue.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.existing-queue.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-existing-queue.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-kms-key-props.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-kms-key-props.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-kms-key-props.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-kms-key-props.expected.json index e50357dbf..44a66441b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-kms-key-props.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-kms-key-props.expected.json @@ -83,6 +83,7 @@ "testiotsqsstackEncryptionKeyAB09201B": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -136,8 +137,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-kms-key-props.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-kms-key-props.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-kms-key-props.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-kms-key-props.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-queue-props.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-queue-props.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-queue-props.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-queue-props.expected.json index d05377618..ad2a1ba1a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-queue-props.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-queue-props.expected.json @@ -84,6 +84,7 @@ "testiotsqsstackEncryptionKeyAB09201B": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -137,8 +138,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-queue-props.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-queue-props.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.use-queue-props.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-use-queue-props.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.with-existing-key.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-with-existing-key.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.with-existing-key.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-with-existing-key.expected.json index 0c20c7a16..59a6f0a87 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.with-existing-key.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-with-existing-key.expected.json @@ -4,6 +4,7 @@ "existingkey205DFC01": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -57,8 +58,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.with-existing-key.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-with-existing-key.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.with-existing-key.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-with-existing-key.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.without-create-kms-key.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-without-create-kms-key.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.without-create-kms-key.expected.json rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-without-create-kms-key.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.without-create-kms-key.ts b/source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-without-create-kms-key.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.without-create-kms-key.ts rename to source/patterns/@aws-solutions-constructs/aws-iot-sqs/test/integ.iotsqs-without-create-kms-key.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.expected.json similarity index 77% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.expected.json index 8863865ec..435729705 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.expected.json @@ -19,6 +19,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -78,6 +84,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3S3LoggingBucketDD0F9F56", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3S3LoggingBucketDD0F9F56", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -119,6 +164,25 @@ } } }, + "testkinesisfirehoses3S3LoggingBucketAutoDeleteObjectsCustomResource043732C2": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testkinesisfirehoses3S3LoggingBucketDD0F9F56" + } + }, + "DependsOn": [ + "testkinesisfirehoses3S3LoggingBucketPolicyE1990698" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testkinesisfirehoses3S3BucketA8942735": { "Type": "AWS::S3::Bucket", "Properties": { @@ -341,7 +405,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosecustomLoggingBuckettestkinesisfirehoses3BC7D2654", + "DeliveryStreamName": "KinesisFirehosefhss3customLogginkettestkinesisfirehoses3C47A3354", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -395,6 +459,64 @@ } } } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "testkinesisfirehoses3S3LoggingBucketDD0F9F56" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.ts similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.ts index a3faa198a..3ba6412e4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.ts @@ -28,6 +28,7 @@ new KinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { }, loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, bucketName: 'custom-logging-bucket', encryption: BucketEncryption.S3_MANAGED, versioned: true diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.expected.json similarity index 69% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.expected.json index f321ef9d2..49c71aa0e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.expected.json @@ -19,6 +19,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -78,6 +84,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testfirehoses3S3LoggingBucket31BFDC22", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testfirehoses3S3LoggingBucket31BFDC22", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -119,6 +164,25 @@ } } }, + "testfirehoses3S3LoggingBucketAutoDeleteObjectsCustomResource98E2B981": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testfirehoses3S3LoggingBucket31BFDC22" + } + }, + "DependsOn": [ + "testfirehoses3S3LoggingBucketPolicyA41D0380" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testfirehoses3S3Bucket93480488": { "Type": "AWS::S3::Bucket", "Properties": { @@ -155,6 +219,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -203,12 +273,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testfirehoses3S3Bucket93480488", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testfirehoses3S3Bucket93480488", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "testfirehoses3S3BucketAutoDeleteObjectsCustomResourceC06077EE": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testfirehoses3S3Bucket93480488" + } + }, + "DependsOn": [ + "testfirehoses3S3BucketPolicyF01906C0" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testfirehoses3firehoseloggroup8067C3EC": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", @@ -341,7 +469,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosenoargumentstestfirehoses3B5E26CE6", + "DeliveryStreamName": "KinesisFirehosefhss3noargumentstestfirehoses3E5198CCB", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -395,6 +523,64 @@ } } } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "testfirehoses3S3LoggingBucket31BFDC22" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.ts similarity index 91% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.ts index 379c01c8d..54f405907 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.ts @@ -23,10 +23,12 @@ stack.templateOptions.description = 'Integration Test for aws-cdk-apl-kinesisfir new KinesisFirehoseToS3(stack, 'test-firehose-s3', { bucketProps: { + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, }, loggingBucketProps: { - removalPolicy: RemovalPolicy.DESTROY + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, } }); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.noLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-noLoggingBucket.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.noLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-noLoggingBucket.expected.json index 37bdeb95e..7a7b81af7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.noLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-noLoggingBucket.expected.json @@ -227,7 +227,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosenoLoggingBuckettestkinesisfirehoses35D36368E", + "DeliveryStreamName": "KinesisFirehosefhss3noLoggingBuckettestkinesisfirehoses33B5B3D4F", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.noLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-noLoggingBucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.noLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-noLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-bucket.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-bucket.expected.json index ffb38796f..541e92ccb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-bucket.expected.json @@ -54,6 +54,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -143,7 +144,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -333,7 +334,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosepreexistingbuckets3preexistingbucketstack85DF91B4", + "DeliveryStreamName": "KinesisFirehosefhss3preexistingbs3preexistingbucketstackBC2A3EB1", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::Join": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-logging-bucket.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-logging-bucket.expected.json index cd3ca176d..9bf4ae7dd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-logging-bucket.expected.json @@ -54,6 +54,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -179,7 +180,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -319,6 +320,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -511,7 +513,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosepreexistinglogginistingloggingbucketstack932A73CD", + "DeliveryStreamName": "KinesisFirehosefhss3preexistinglistingloggingbucketstackE08C8853", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-logging-bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.pre-existing-logging-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-pre-existing-logging-bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json similarity index 76% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json index 16ee3aed5..8ca18c263 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json @@ -19,6 +19,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -78,6 +84,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "firstconstructS3LoggingBucket7A5DAF91", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "firstconstructS3LoggingBucket7A5DAF91", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -119,6 +164,25 @@ } } }, + "firstconstructS3LoggingBucketAutoDeleteObjectsCustomResourceF1551A63": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "firstconstructS3LoggingBucket7A5DAF91" + } + }, + "DependsOn": [ + "firstconstructS3LoggingBucketPolicy14219998" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "firstconstructS3Bucket58522C24": { "Type": "AWS::S3::Bucket", "Properties": { @@ -341,7 +405,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosetwoinstancesfirstconstructC62A83C0", + "DeliveryStreamName": "KinesisFirehosefhss3twoinstancesfirstconstructDCFDB833", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -396,6 +460,64 @@ } } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "firstconstructS3LoggingBucket7A5DAF91" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] + }, "secondconstructS3LoggingBucketBB57C475": { "Type": "AWS::S3::Bucket", "Properties": { @@ -414,6 +536,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -473,6 +601,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "secondconstructS3LoggingBucketBB57C475", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "secondconstructS3LoggingBucketBB57C475", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -514,6 +681,25 @@ } } }, + "secondconstructS3LoggingBucketAutoDeleteObjectsCustomResource11E44F47": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "secondconstructS3LoggingBucketBB57C475" + } + }, + "DependsOn": [ + "secondconstructS3LoggingBucketPolicy88BAA4BE" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "secondconstructS3Bucket6D7D46A0": { "Type": "AWS::S3::Bucket", "Properties": { @@ -550,6 +736,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -598,12 +790,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "secondconstructS3Bucket6D7D46A0", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "secondconstructS3Bucket6D7D46A0", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "secondconstructS3BucketAutoDeleteObjectsCustomResource02D988EB": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "secondconstructS3Bucket6D7D46A0" + } + }, + "DependsOn": [ + "secondconstructS3BucketPolicy4B404A49" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "secondconstructfirehoseloggroupB59EDD4C": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", @@ -736,7 +986,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosetwoinstancessecondconstruct96E71AB7", + "DeliveryStreamName": "KinesisFirehosefhss3twoinstancessecondconstructB86AFB63", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts index 0f32b7ea7..78100868c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.two-instances.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts @@ -26,15 +26,18 @@ new KinesisFirehoseToS3(stack, 'first-construct', { removalPolicy: RemovalPolicy.DESTROY, }, loggingBucketProps: { + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY } }); new KinesisFirehoseToS3(stack, 'second-construct', { bucketProps: { + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, }, loggingBucketProps: { + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY } }); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-code-asset-job.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-code-asset-job.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-code-asset-job.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.code-asset-job.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-code-asset-job.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-existing-job.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-existing-job.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-existing-job.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.existing-job.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-existing-job.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-no-arguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-no-arguments.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/integ.kinglu-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json similarity index 80% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json index 5f138e5ae..0e5a01deb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json @@ -30,6 +30,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -89,6 +95,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -130,6 +175,25 @@ } } }, + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketAutoDeleteObjectsCustomResourceB808B0FC": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C" + } + }, + "DependsOn": [ + "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketPolicyCF0D71BD" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF": { "Type": "AWS::S3::Bucket", "Properties": { @@ -349,7 +413,7 @@ "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D": { "Type": "AWS::KinesisFirehose::DeliveryStream", "Properties": { - "DeliveryStreamName": "KinesisFirehosecustomLoggingBuckoses3KinesisFirehoseToS38ABD91BB", + "DeliveryStreamName": "KinesisFirehosekinfhss3customLogoses3KinesisFirehoseToS397A96F65", "DeliveryStreamType": "KinesisStreamAsSource", "ExtendedS3DestinationConfiguration": { "BucketARN": { @@ -486,6 +550,64 @@ } ] } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts index 6d44b7bdc..c92597c52 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts @@ -28,6 +28,7 @@ new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { }, loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, bucketName: 'custom-logging-bucket', encryption: BucketEncryption.S3_MANAGED, versioned: true diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-bucket.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-bucket.expected.json index df0c49758..7dc7b46c3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-bucket.expected.json @@ -54,6 +54,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -143,7 +144,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -341,7 +342,7 @@ "testexistingbucketfirehoses3stackKinesisFirehoseToS3KinesisFirehose46614BF6": { "Type": "AWS::KinesisFirehose::DeliveryStream", "Properties": { - "DeliveryStreamName": "KinesisFirehoseexistingbuckettesstackKinesisFirehoseToS3E85D23B4", + "DeliveryStreamName": "KinesisFirehosekinfhss3existingbstackKinesisFirehoseToS3129F8DDB", "DeliveryStreamType": "KinesisStreamAsSource", "ExtendedS3DestinationConfiguration": { "BucketARN": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-logging-bucket.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-logging-bucket.expected.json index 7a92b2333..8dca0cfcf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-logging-bucket.expected.json @@ -54,6 +54,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -143,7 +144,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -420,7 +421,7 @@ "testexistingloggingbucketstreamsfirehoses3stackKinesisFirehoseToS3KinesisFirehose5F6EDEF6": { "Type": "AWS::KinesisFirehose::DeliveryStream", "Properties": { - "DeliveryStreamName": "KinesisFirehoseexistingloggingbustackKinesisFirehoseToS316B2A519", + "DeliveryStreamName": "KinesisFirehosekinfhss3existinglstackKinesisFirehoseToS35F3A1FB9", "DeliveryStreamType": "KinesisStreamAsSource", "ExtendedS3DestinationConfiguration": { "BucketARN": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-logging-bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existing-logging-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existing-logging-bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existingStreamObj.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existingStreamObj.expected.json index 93eda755b..3326ca21f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existingStreamObj.expected.json @@ -193,7 +193,7 @@ } } }, - "testkinesislambdaLambdaFunctionKinesisEventSourceexistingStreamObjtestkinesislambdaKinesisStreamA54D0C79BE6AA8BC": { + "testkinesislambdaLambdaFunctionKinesisEventSourcekinfhss3existingStreamObjtestkinesislambdaKinesisStream06A6475B85130EBE": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "BatchSize": 100, @@ -551,7 +551,7 @@ "testexistingstreamfirehoses3stackKinesisFirehoseToS3KinesisFirehose0834A7FB": { "Type": "AWS::KinesisFirehose::DeliveryStream", "Properties": { - "DeliveryStreamName": "KinesisFirehoseexistingStreamObjstackKinesisFirehoseToS36519FC08", + "DeliveryStreamName": "KinesisFirehosekinfhss3existingSstackKinesisFirehoseToS3A84F50F0", "DeliveryStreamType": "KinesisStreamAsSource", "ExtendedS3DestinationConfiguration": { "BucketARN": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existingStreamObj.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.existingStreamObj.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-existingStreamObj.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-no-arguments.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-no-arguments.expected.json index 97ed031e5..ee1895cbd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-no-arguments.expected.json @@ -349,7 +349,7 @@ "teststreamfirehoses3KinesisFirehoseToS3KinesisFirehose7303FF77": { "Type": "AWS::KinesisFirehose::DeliveryStream", "Properties": { - "DeliveryStreamName": "KinesisFirehosenoargumentsteststoses3KinesisFirehoseToS3288D7D36", + "DeliveryStreamName": "KinesisFirehosekinfhss3noargumenoses3KinesisFirehoseToS339497FE1", "DeliveryStreamType": "KinesisStreamAsSource", "ExtendedS3DestinationConfiguration": { "BucketARN": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-existing.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-existing.expected.json index 674cf8651..0815a5af7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-existing.expected.json @@ -152,7 +152,7 @@ } } }, - "testfnKinesisEventSourceexistingteststream96164F11F0EBC1A4": { + "testfnKinesisEventSourcekinlamexistingteststream6B91D22533D472A8": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "BatchSize": 1, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-existing.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.existing.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-existing.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-no-arguments.expected.json index 3988a597e..a8739f8ac 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-no-arguments.expected.json @@ -193,7 +193,7 @@ } } }, - "testkinesisstreamslambdaLambdaFunctionKinesisEventSourcenoargumentstestkinesisstreamslambdaKinesisStream697B4A2015E59078": { + "testkinesisstreamslambdaLambdaFunctionKinesisEventSourcekinlamnoargumentstestkinesisstreamslambdaKinesisStreamB15C5952638E81E3": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "BatchSize": 100, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-kinesisstreams-lambda/test/integ.kinlam-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-add-secondary-index.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-add-secondary-index.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-add-secondary-index.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.add-secondary-index.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-add-secondary-index.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithExistingVpc.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithExistingVpc.expected.json index f0a2aa527..393dea3ca 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithExistingVpc.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamddb-deployFunctionWithExistingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -842,7 +842,7 @@ "testlambdadynamodbstackReplaceDefaultSecurityGroupsecuritygroup15025C82": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithExistingVpc/test-lambda-dynamodb-stack/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamddb-deployFunctionWithExistingVpc/test-lambda-dynamodb-stack/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithExistingVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithExistingVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithExistingVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithVpc.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithVpc.expected.json index 17fcd590c..1d10739ad 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithVpc.expected.json @@ -132,7 +132,7 @@ "testlambdadynamodbstackReplaceDefaultSecurityGroupsecuritygroup15025C82": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/test-lambda-dynamodb-stack/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamddb-deployFunctionWithVpc/test-lambda-dynamodb-stack/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -271,7 +271,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "lamddb-deployFunctionWithVpc/Vpc" } ] } @@ -293,7 +293,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamddb-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -307,7 +307,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamddb-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -343,7 +343,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamddb-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -357,7 +357,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamddb-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -393,7 +393,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamddb-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -407,7 +407,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamddb-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -444,7 +444,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamddb-deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -496,7 +496,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamddb-deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -533,7 +533,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamddb-deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.deployFunctionWithVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-deployFunctionWithVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-no-arguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-no-arguments.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-set-billing-mode.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-set-billing-mode.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-set-billing-mode.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.set-billing-mode.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-set-billing-mode.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-use-existing-func.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-use-existing-func.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-use-existing-func.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.use-existing-func.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/test/integ.lamddb-use-existing-func.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-existingResources.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-existingResources.expected.json index 4d18bbc39..677ccfe7e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-existingResources.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc" + "Value": "lammem-existingResources/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "existingResources/Vpc/isolatedSubnet1" + "Value": "lammem-existingResources/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -47,7 +47,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc/isolatedSubnet1" + "Value": "lammem-existingResources/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -83,7 +83,7 @@ }, { "Key": "Name", - "Value": "existingResources/Vpc/isolatedSubnet2" + "Value": "lammem-existingResources/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -97,7 +97,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc/isolatedSubnet2" + "Value": "lammem-existingResources/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -133,7 +133,7 @@ }, { "Key": "Name", - "Value": "existingResources/Vpc/isolatedSubnet3" + "Value": "lammem-existingResources/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -147,7 +147,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc/isolatedSubnet3" + "Value": "lammem-existingResources/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -184,7 +184,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc/FlowLog" + "Value": "lammem-existingResources/Vpc/FlowLog" } ] } @@ -236,7 +236,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc/FlowLog" + "Value": "lammem-existingResources/Vpc/FlowLog" } ] }, @@ -273,7 +273,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingResources/Vpc/FlowLog" + "Value": "lammem-existingResources/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -282,7 +282,7 @@ "testsgsecuritygroup89DCF621": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingResources/test-sg-security-group", + "GroupDescription": "lammem-existingResources/test-sg-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -468,7 +468,7 @@ "testcachecachesg7265880E": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingResources/test-cache-cachesg", + "GroupDescription": "lammem-existingResources/test-cache-cachesg", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -531,7 +531,7 @@ "testtestcachesg9F6CF9E2": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingResources/test/test-cachesg", + "GroupDescription": "lammem-existingResources/test/test-cachesg", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-existingResources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.existingResources.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-existingResources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-newResources.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-newResources.expected.json index 6c53c8f4c..ef433e887 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-newResources.expected.json @@ -4,7 +4,7 @@ "testtestcachesg9F6CF9E2": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "newResources/test/test-cachesg", + "GroupDescription": "lammem-newResources/test/test-cachesg", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -199,7 +199,7 @@ "testReplaceDefaultSecurityGroupsecuritygroupAC4F969B": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "newResources/test/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lammem-newResources/test/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -335,7 +335,7 @@ "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc" + "Value": "lammem-newResources/Vpc" } ] } @@ -357,7 +357,7 @@ }, { "Key": "Name", - "Value": "newResources/Vpc/isolatedSubnet1" + "Value": "lammem-newResources/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -371,7 +371,7 @@ "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc/isolatedSubnet1" + "Value": "lammem-newResources/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -407,7 +407,7 @@ }, { "Key": "Name", - "Value": "newResources/Vpc/isolatedSubnet2" + "Value": "lammem-newResources/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -421,7 +421,7 @@ "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc/isolatedSubnet2" + "Value": "lammem-newResources/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -457,7 +457,7 @@ }, { "Key": "Name", - "Value": "newResources/Vpc/isolatedSubnet3" + "Value": "lammem-newResources/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -471,7 +471,7 @@ "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc/isolatedSubnet3" + "Value": "lammem-newResources/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -508,7 +508,7 @@ "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc/FlowLog" + "Value": "lammem-newResources/Vpc/FlowLog" } ] } @@ -560,7 +560,7 @@ "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc/FlowLog" + "Value": "lammem-newResources/Vpc/FlowLog" } ] }, @@ -597,7 +597,7 @@ "Tags": [ { "Key": "Name", - "Value": "newResources/Vpc/FlowLog" + "Value": "lammem-newResources/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-newResources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.newResources.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-newResources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-withClientProps.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-withClientProps.expected.json index cc0020c2e..5372ad2bb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-withClientProps.expected.json @@ -4,7 +4,7 @@ "testtestcachesg9F6CF9E2": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "withClientProps/test/test-cachesg", + "GroupDescription": "lammem-withClientProps/test/test-cachesg", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -199,7 +199,7 @@ "testReplaceDefaultSecurityGroupsecuritygroupAC4F969B": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "withClientProps/test/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lammem-withClientProps/test/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -335,7 +335,7 @@ "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc" + "Value": "lammem-withClientProps/Vpc" } ] } @@ -357,7 +357,7 @@ }, { "Key": "Name", - "Value": "withClientProps/Vpc/isolatedSubnet1" + "Value": "lammem-withClientProps/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -371,7 +371,7 @@ "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc/isolatedSubnet1" + "Value": "lammem-withClientProps/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -407,7 +407,7 @@ }, { "Key": "Name", - "Value": "withClientProps/Vpc/isolatedSubnet2" + "Value": "lammem-withClientProps/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -421,7 +421,7 @@ "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc/isolatedSubnet2" + "Value": "lammem-withClientProps/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -457,7 +457,7 @@ }, { "Key": "Name", - "Value": "withClientProps/Vpc/isolatedSubnet3" + "Value": "lammem-withClientProps/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -471,7 +471,7 @@ "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc/isolatedSubnet3" + "Value": "lammem-withClientProps/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -508,7 +508,7 @@ "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc/FlowLog" + "Value": "lammem-withClientProps/Vpc/FlowLog" } ] } @@ -560,7 +560,7 @@ "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc/FlowLog" + "Value": "lammem-withClientProps/Vpc/FlowLog" } ] }, @@ -597,7 +597,7 @@ "Tags": [ { "Key": "Name", - "Value": "withClientProps/Vpc/FlowLog" + "Value": "lammem-withClientProps/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-withClientProps.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.withClientProps.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticachememcached/test/integ.lammem-withClientProps.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithClusterConfig.expected.json similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithClusterConfig.expected.json index ea01e758f..bc1b69f2c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithClusterConfig.expected.json @@ -103,7 +103,7 @@ "testlambdaelasticsearchkibana5ReplaceDefaultSecurityGroupsecuritygroup375DBE67": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithClusterConfig/test-lambda-elasticsearch-kibana5/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamels-deployFunctionWithClusterConfig/test-lambda-elasticsearch-kibana5/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -742,7 +742,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc" + "Value": "lamels-deployFunctionWithClusterConfig/Vpc" } ] } @@ -764,7 +764,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc/isolatedSubnet1" + "Value": "lamels-deployFunctionWithClusterConfig/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -778,7 +778,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc/isolatedSubnet1" + "Value": "lamels-deployFunctionWithClusterConfig/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -814,7 +814,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc/isolatedSubnet2" + "Value": "lamels-deployFunctionWithClusterConfig/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -828,7 +828,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc/isolatedSubnet2" + "Value": "lamels-deployFunctionWithClusterConfig/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -865,7 +865,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc/FlowLog" + "Value": "lamels-deployFunctionWithClusterConfig/Vpc/FlowLog" } ] } @@ -917,7 +917,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc/FlowLog" + "Value": "lamels-deployFunctionWithClusterConfig/Vpc/FlowLog" } ] }, @@ -954,7 +954,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithClusterConfig/Vpc/FlowLog" + "Value": "lamels-deployFunctionWithClusterConfig/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithClusterConfig.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithClusterConfig.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithClusterConfig.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithExistingVpc.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithExistingVpc.expected.json index 0e5f2100c..13c66593b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithExistingVpc.expected.json @@ -10,7 +10,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc" } ] } @@ -32,7 +32,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -56,7 +56,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -97,7 +97,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ] } @@ -117,7 +117,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ] }, @@ -143,7 +143,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -167,7 +167,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -208,7 +208,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ] } @@ -228,7 +228,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ] }, @@ -254,7 +254,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -278,7 +278,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -319,7 +319,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ] } @@ -339,7 +339,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ] }, @@ -365,7 +365,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -379,7 +379,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -427,7 +427,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -441,7 +441,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -489,7 +489,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -503,7 +503,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/FlowLog" } ] }, @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamels-deployFunctionWithExistingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -772,7 +772,7 @@ "testlambdaelasticsearchkibana4ReplaceDefaultSecurityGroupsecuritygroupA79E2B92": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithExistingVpc/test-lambda-elasticsearch-kibana4/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamels-deployFunctionWithExistingVpc/test-lambda-elasticsearch-kibana4/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithExistingVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithExistingVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithExistingVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithVpcProps.expected.json similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithVpcProps.expected.json index ca661cffd..9d673ea62 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithVpcProps.expected.json @@ -103,7 +103,7 @@ "testlambdaelasticsearchkibana3ReplaceDefaultSecurityGroupsecuritygroupEB497E1A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpcProps/test-lambda-elasticsearch-kibana3/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamels-deployFunctionWithVpcProps/test-lambda-elasticsearch-kibana3/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -747,7 +747,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc" + "Value": "lamels-deployFunctionWithVpcProps/Vpc" } ] } @@ -769,7 +769,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet1" + "Value": "lamels-deployFunctionWithVpcProps/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -783,7 +783,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet1" + "Value": "lamels-deployFunctionWithVpcProps/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -819,7 +819,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet2" + "Value": "lamels-deployFunctionWithVpcProps/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -833,7 +833,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet2" + "Value": "lamels-deployFunctionWithVpcProps/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -869,7 +869,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet3" + "Value": "lamels-deployFunctionWithVpcProps/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -883,7 +883,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc/isolatedSubnet3" + "Value": "lamels-deployFunctionWithVpcProps/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -920,7 +920,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc/FlowLog" + "Value": "lamels-deployFunctionWithVpcProps/Vpc/FlowLog" } ] } @@ -972,7 +972,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc/FlowLog" + "Value": "lamels-deployFunctionWithVpcProps/Vpc/FlowLog" } ] }, @@ -1009,7 +1009,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpcProps/Vpc/FlowLog" + "Value": "lamels-deployFunctionWithVpcProps/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithVpcProps.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployFunctionWithVpcProps.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployFunctionWithVpcProps.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployToFiveZones.expected.json similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployToFiveZones.expected.json index 17ec407e2..1c61216cc 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployToFiveZones.expected.json @@ -103,7 +103,7 @@ "testlambdaelasticsearchkibanaReplaceDefaultSecurityGroupsecuritygroup9C517245": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployToFiveZones/test-lambda-elasticsearch-kibana/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamels-deployToFiveZones/test-lambda-elasticsearch-kibana/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -749,7 +749,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc" + "Value": "lamels-deployToFiveZones/Vpc" } ] } @@ -771,7 +771,7 @@ }, { "Key": "Name", - "Value": "deployToFiveZones/Vpc/isolatedSubnet1" + "Value": "lamels-deployToFiveZones/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -785,7 +785,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc/isolatedSubnet1" + "Value": "lamels-deployToFiveZones/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -821,7 +821,7 @@ }, { "Key": "Name", - "Value": "deployToFiveZones/Vpc/isolatedSubnet2" + "Value": "lamels-deployToFiveZones/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -835,7 +835,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc/isolatedSubnet2" + "Value": "lamels-deployToFiveZones/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -871,7 +871,7 @@ }, { "Key": "Name", - "Value": "deployToFiveZones/Vpc/isolatedSubnet3" + "Value": "lamels-deployToFiveZones/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -885,7 +885,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc/isolatedSubnet3" + "Value": "lamels-deployToFiveZones/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -922,7 +922,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc/FlowLog" + "Value": "lamels-deployToFiveZones/Vpc/FlowLog" } ] } @@ -974,7 +974,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc/FlowLog" + "Value": "lamels-deployToFiveZones/Vpc/FlowLog" } ] }, @@ -1011,7 +1011,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployToFiveZones/Vpc/FlowLog" + "Value": "lamels-deployToFiveZones/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployToFiveZones.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.deployToFiveZones.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-deployToFiveZones.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-disabledZoneAwareness.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-disabledZoneAwareness.expected.json index cff23b60c..2d56aedbb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-disabledZoneAwareness.expected.json @@ -103,7 +103,7 @@ "testlambdaelasticsearchkibanaReplaceDefaultSecurityGroupsecuritygroup9C517245": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "disabledZoneAwareness/test-lambda-elasticsearch-kibana/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamels-disabledZoneAwareness/test-lambda-elasticsearch-kibana/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -732,7 +732,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabledZoneAwareness/Vpc" + "Value": "lamels-disabledZoneAwareness/Vpc" } ] } @@ -754,7 +754,7 @@ }, { "Key": "Name", - "Value": "disabledZoneAwareness/Vpc/isolatedSubnet1" + "Value": "lamels-disabledZoneAwareness/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -768,7 +768,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabledZoneAwareness/Vpc/isolatedSubnet1" + "Value": "lamels-disabledZoneAwareness/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -805,7 +805,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabledZoneAwareness/Vpc/FlowLog" + "Value": "lamels-disabledZoneAwareness/Vpc/FlowLog" } ] } @@ -857,7 +857,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabledZoneAwareness/Vpc/FlowLog" + "Value": "lamels-disabledZoneAwareness/Vpc/FlowLog" } ] }, @@ -894,7 +894,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabledZoneAwareness/Vpc/FlowLog" + "Value": "lamels-disabledZoneAwareness/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-disabledZoneAwareness.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.disabledZoneAwareness.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-disabledZoneAwareness.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-domain-arguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-domain-arguments.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-domain-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.domain-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-domain-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-no-arguments.expected.json index 0bc0190a8..12fc8a8e0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-no-arguments.expected.json @@ -98,12 +98,6 @@ }, "S3Key": "35bbbc7b04b21f225891f139adf234188f348ebad5f4bbc2c06edf8aa3784c97.zip" }, - "Role": { - "Fn::GetAtt": [ - "testlambdaelasticsearchkibanaLambdaFunctionServiceRole3AFFEAA2", - "Arn" - ] - }, "Environment": { "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", @@ -116,6 +110,12 @@ } }, "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "testlambdaelasticsearchkibanaLambdaFunctionServiceRole3AFFEAA2", + "Arn" + ] + }, "Runtime": "nodejs16.x", "TracingConfig": { "Mode": "Active" @@ -181,9 +181,6 @@ "testlambdaelasticsearchkibanaCognitoUserPoolClient8F70A2AA": { "Type": "AWS::Cognito::UserPoolClient", "Properties": { - "UserPoolId": { - "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" - }, "AllowedOAuthFlows": [ "implicit", "code" @@ -201,7 +198,10 @@ ], "SupportedIdentityProviders": [ "COGNITO" - ] + ], + "UserPoolId": { + "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" + } } }, "testlambdaelasticsearchkibanaCognitoIdentityPoolC48068F0": { @@ -227,7 +227,7 @@ "testlambdaelasticsearchkibanaUserPoolDomainB9BDF063": { "Type": "AWS::Cognito::UserPoolDomain", "Properties": { - "Domain": "domain-args-cogn-9e5", + "Domain": "domain-args-cogn-23e", "UserPoolId": { "Ref": "testlambdaelasticsearchkibanaCognitoUserPool9537802B" } @@ -284,7 +284,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/domain-args-cogn-9e5/*" + ":domain/domain-args-cogn-23e/*" ] ] } @@ -397,7 +397,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/domain-args-9e54" + ":domain/domain-args-23e2" ] ] } @@ -469,7 +469,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/domain-args-9e54/*" + ":domain/domain-args-23e2/*" ] ] } @@ -496,7 +496,7 @@ "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, - "DomainName": "domain-args-9e54", + "DomainName": "domain-args-23e2", "EBSOptions": { "EBSEnabled": true, "VolumeSize": 10 @@ -539,9 +539,9 @@ "testlambdaelasticsearchkibanaStatusRedAlarmCFCDB629": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one primary shard and its replicas are not allocated to a node. ", "MetricName": "ClusterStatus.red", "Namespace": "AWS/ES", "Period": 60, @@ -552,9 +552,9 @@ "testlambdaelasticsearchkibanaStatusYellowAlarm24B9D1CB": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "At least one replica shard is not allocated to a node.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "At least one replica shard is not allocated to a node.", "MetricName": "ClusterStatus.yellow", "Namespace": "AWS/ES", "Period": 60, @@ -565,9 +565,9 @@ "testlambdaelasticsearchkibanaFreeStorageSpaceTooLowAlarm0B4D4E35": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "ComparisonOperator": "LessThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "A node in your cluster is down to 20 GiB of free storage space.", "MetricName": "FreeStorageSpace", "Namespace": "AWS/ES", "Period": 60, @@ -578,9 +578,9 @@ "testlambdaelasticsearchkibanaIndexWritesBlockedTooHighAlarmB8C0E99C": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Your cluster is blocking write requests.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Your cluster is blocking write requests.", "MetricName": "ClusterIndexWritesBlocked", "Namespace": "AWS/ES", "Period": 300, @@ -591,9 +591,9 @@ "testlambdaelasticsearchkibanaAutomatedSnapshotFailureTooHighAlarm75F2676B": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "An automated snapshot failed. This failure is often the result of a red cluster health status.", "MetricName": "AutomatedSnapshotFailure", "Namespace": "AWS/ES", "Period": 60, @@ -604,9 +604,9 @@ "testlambdaelasticsearchkibanaCPUUtilizationTooHighAlarmF16BA5D9": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "100% CPU utilization is not uncommon, but sustained high usage is problematic. Consider using larger instance types or adding instances.", "MetricName": "CPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -617,9 +617,9 @@ "testlambdaelasticsearchkibanaJVMMemoryPressureTooHighAlarm18224533": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "JVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, @@ -630,9 +630,9 @@ "testlambdaelasticsearchkibanaMasterCPUUtilizationTooHighAlarmE5E5999F": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 3, - "AlarmDescription": "Average CPU utilization over last 45 minutes too high. Consider using larger instance types for your dedicated master nodes.", "MetricName": "MasterCPUUtilization", "Namespace": "AWS/ES", "Period": 900, @@ -643,9 +643,9 @@ "testlambdaelasticsearchkibanaMasterJVMMemoryPressureTooHighAlarm297FF1BE": { "Type": "AWS::CloudWatch::Alarm", "Properties": { + "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "ComparisonOperator": "GreaterThanOrEqualToThreshold", "EvaluationPeriods": 1, - "AlarmDescription": "Average JVM memory pressure over last 15 minutes too high. Consider scaling vertically.", "MetricName": "MasterJVMMemoryPressure", "Namespace": "AWS/ES", "Period": 900, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-no-arguments.ts similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-no-arguments.ts index 9663113ff..2a353276f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-elasticsearch-kibana/test/integ.lamels-no-arguments.ts @@ -27,8 +27,8 @@ const lambdaProps: lambda.FunctionProps = { handler: 'index.handler' }; -const esDomain = 'domain-args-9e54'; -const cognitoDomain = 'domain-args-cogn-9e5'; +const esDomain = 'domain-args-23e2'; +const cognitoDomain = 'domain-args-cogn-23e'; new LambdaToElasticSearchAndKibana(stack, 'test-lambda-elasticsearch-kibana', { lambdaFunctionProps: lambdaProps, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.expected.json index e44ac5c83..939de6d5f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.expected.json @@ -114,7 +114,7 @@ "testlambdaeventbridgeReplaceDefaultSecurityGroupsecuritygroup11BC24F6": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithNewEventBus/test-lambda-eventbridge/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamevt-deployFunctionWithNewEventBus/test-lambda-eventbridge/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -233,7 +233,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc" } ] } @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet1" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -269,7 +269,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet1" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -305,7 +305,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet2" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -319,7 +319,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet2" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -355,7 +355,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet3" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -369,7 +369,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc/isolatedSubnet3" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -406,7 +406,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc/FlowLog" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc/FlowLog" } ] } @@ -458,7 +458,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc/FlowLog" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc/FlowLog" } ] }, @@ -495,7 +495,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithNewEventBus/Vpc/FlowLog" + "Value": "lamevt-deployFunctionWithNewEventBus/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -508,7 +508,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "deployFunctionWithNewEventBusCLOUDWATCHEVENTSsecuritygroupD8A263BF", + "lamevtdeployFunctionWithNewEventBusCLOUDWATCHEVENTSsecuritygroup53EAC818", "GroupId" ] } @@ -542,10 +542,10 @@ } } }, - "deployFunctionWithNewEventBusCLOUDWATCHEVENTSsecuritygroupD8A263BF": { + "lamevtdeployFunctionWithNewEventBusCLOUDWATCHEVENTSsecuritygroup53EAC818": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithNewEventBus/deployFunctionWithNewEventBus-CLOUDWATCH_EVENTS-security-group", + "GroupDescription": "lamevt-deployFunctionWithNewEventBus/lamevt-deployFunctionWithNewEventBus-CLOUDWATCH_EVENTS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithVpc.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithVpc.expected.json index 916504c1e..cb9a267e9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithVpc.expected.json @@ -128,7 +128,7 @@ "testlambdaeventbridgeReplaceDefaultSecurityGroupsecuritygroup11BC24F6": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/test-lambda-eventbridge/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamevt-deployFunctionWithVpc/test-lambda-eventbridge/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -239,7 +239,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "lamevt-deployFunctionWithVpc/Vpc" } ] } @@ -261,7 +261,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamevt-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -275,7 +275,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamevt-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -311,7 +311,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamevt-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -325,7 +325,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamevt-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -361,7 +361,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamevt-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -375,7 +375,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamevt-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -412,7 +412,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamevt-deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -464,7 +464,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamevt-deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -501,7 +501,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamevt-deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -514,7 +514,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "deployFunctionWithVpcCLOUDWATCHEVENTSsecuritygroupB8797C76", + "lamevtdeployFunctionWithVpcCLOUDWATCHEVENTSsecuritygroupE6014B35", "GroupId" ] } @@ -548,10 +548,10 @@ } } }, - "deployFunctionWithVpcCLOUDWATCHEVENTSsecuritygroupB8797C76": { + "lamevtdeployFunctionWithVpcCLOUDWATCHEVENTSsecuritygroupE6014B35": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/deployFunctionWithVpc-CLOUDWATCH_EVENTS-security-group", + "GroupDescription": "lamevt-deployFunctionWithVpc/lamevt-deployFunctionWithVpc-CLOUDWATCH_EVENTS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-minimal-arguments.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-minimal-arguments.expected.json index 95121ec2e..59e2e4791 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-minimal-arguments.expected.json @@ -54,6 +54,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -143,7 +144,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-minimal-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.minimal-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-minimal-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-multiple-sources.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-multiple-sources.expected.json index 3850d7547..ca73db9b8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-multiple-sources.expected.json @@ -54,6 +54,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -143,7 +144,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-multiple-sources.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.multiple-sources.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-multiple-sources.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-with-vpc.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-with-vpc.expected.json index 0bc0c7c64..0e39ea284 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-with-vpc.expected.json @@ -54,6 +54,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -143,7 +144,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -320,7 +321,7 @@ "minimalargumentsReplaceDefaultSecurityGroupsecuritygroupFDD71705": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "with-vpc/minimal-arguments/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamken-with-vpc/minimal-arguments/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -713,7 +714,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc" + "Value": "lamken-with-vpc/Vpc" } ] } @@ -735,7 +736,7 @@ }, { "Key": "Name", - "Value": "with-vpc/Vpc/isolatedSubnet1" + "Value": "lamken-with-vpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -749,7 +750,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc/isolatedSubnet1" + "Value": "lamken-with-vpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -785,7 +786,7 @@ }, { "Key": "Name", - "Value": "with-vpc/Vpc/isolatedSubnet2" + "Value": "lamken-with-vpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -799,7 +800,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc/isolatedSubnet2" + "Value": "lamken-with-vpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -835,7 +836,7 @@ }, { "Key": "Name", - "Value": "with-vpc/Vpc/isolatedSubnet3" + "Value": "lamken-with-vpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -849,7 +850,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc/isolatedSubnet3" + "Value": "lamken-with-vpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -886,7 +887,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc/FlowLog" + "Value": "lamken-with-vpc/Vpc/FlowLog" } ] } @@ -938,7 +939,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc/FlowLog" + "Value": "lamken-with-vpc/Vpc/FlowLog" } ] }, @@ -975,7 +976,7 @@ "Tags": [ { "Key": "Name", - "Value": "with-vpc/Vpc/FlowLog" + "Value": "lamken-with-vpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -988,7 +989,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "withvpcKENDRAsecuritygroup6E04E691", + "lamkenwithvpcKENDRAsecuritygroup1395B6D2", "GroupId" ] } @@ -1022,10 +1023,10 @@ } } }, - "withvpcKENDRAsecuritygroup6E04E691": { + "lamkenwithvpcKENDRAsecuritygroup1395B6D2": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "with-vpc/with-vpc-KENDRA-security-group", + "GroupDescription": "lamken-with-vpc/lamken-with-vpc-KENDRA-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-with-vpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.with-vpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kendra/test/integ.lamken-with-vpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-function.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-function.expected.json index 00be5feb3..7a642190b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-function.expected.json @@ -85,6 +85,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -274,6 +275,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -466,7 +468,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseexistingfunctiondestinationfirehoseE53928C2", + "DeliveryStreamName": "KinesisFirehoselamfhsexistingfunctiondestinationfirehose3D67ADFF", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -550,7 +552,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -670,7 +672,7 @@ }, "Environment": { "Variables": { - "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehoseexistingfunctiondestinationfirehoseE53928C2" + "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehoselamfhsexistingfunctiondestinationfirehose3D67ADFF" } }, "Handler": "index.handler", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-function.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-function.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-function.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-vpc.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-vpc.expected.json index 624ba79bd..92d962deb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-vpc.expected.json @@ -85,6 +85,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -274,6 +275,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -466,7 +468,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseexistingvpcdestinationfirehoseFCC6BBF7", + "DeliveryStreamName": "KinesisFirehoselamfhsexistingvpcdestinationfirehose623CCD9C", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -550,7 +552,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -607,7 +609,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "lamfhs-existing-vpc/Vpc" } ] } @@ -629,7 +631,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet1" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -653,7 +655,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet1" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -694,7 +696,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet1" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet1" } ] } @@ -714,7 +716,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet1" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet1" } ] }, @@ -740,7 +742,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet2" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -764,7 +766,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet2" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -805,7 +807,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet2" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet2" } ] } @@ -825,7 +827,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet2" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet2" } ] }, @@ -851,7 +853,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet3" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -875,7 +877,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet3" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -916,7 +918,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet3" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet3" } ] } @@ -936,7 +938,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet3" + "Value": "lamfhs-existing-vpc/Vpc/PublicSubnet3" } ] }, @@ -962,7 +964,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet1" + "Value": "lamfhs-existing-vpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -976,7 +978,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet1" + "Value": "lamfhs-existing-vpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -1024,7 +1026,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet2" + "Value": "lamfhs-existing-vpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1038,7 +1040,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet2" + "Value": "lamfhs-existing-vpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -1086,7 +1088,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet3" + "Value": "lamfhs-existing-vpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1100,7 +1102,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet3" + "Value": "lamfhs-existing-vpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -1137,7 +1139,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "lamfhs-existing-vpc/Vpc" } ] } @@ -1171,7 +1173,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/FlowLog" + "Value": "lamfhs-existing-vpc/Vpc/FlowLog" } ] } @@ -1223,7 +1225,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/FlowLog" + "Value": "lamfhs-existing-vpc/Vpc/FlowLog" } ] }, @@ -1260,7 +1262,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/FlowLog" + "Value": "lamfhs-existing-vpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1273,7 +1275,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingvpcKINESISFIREHOSEsecuritygroupF123580F", + "lamfhsexistingvpcKINESISFIREHOSEsecuritygroup18F0C673", "GroupId" ] } @@ -1425,7 +1427,7 @@ "testconstructReplaceDefaultSecurityGroupsecuritygroup05665D84": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-vpc/test-construct/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamfhs-existing-vpc/test-construct/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -1463,7 +1465,7 @@ }, "Environment": { "Variables": { - "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehoseexistingvpcdestinationfirehoseFCC6BBF7" + "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehoselamfhsexistingvpcdestinationfirehose623CCD9C" } }, "Handler": "index.handler", @@ -1528,10 +1530,10 @@ } } }, - "existingvpcKINESISFIREHOSEsecuritygroupF123580F": { + "lamfhsexistingvpcKINESISFIREHOSEsecuritygroup18F0C673": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-vpc/existing-vpc-KINESIS_FIREHOSE-security-group", + "GroupDescription": "lamfhs-existing-vpc/lamfhs-existing-vpc-KINESIS_FIREHOSE-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-vpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.existing-vpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-existing-vpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-new-vpc.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-new-vpc.expected.json index 77af4c7da..2fc62c689 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-new-vpc.expected.json @@ -85,6 +85,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -274,6 +275,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -466,7 +468,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosenewvpcdestinationfirehoseEC1F5A2C", + "DeliveryStreamName": "KinesisFirehoselamfhsnewvpcdestinationfirehoseF2428936", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -550,7 +552,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -715,7 +717,7 @@ "testconstructReplaceDefaultSecurityGroupsecuritygroup05665D84": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-vpc/test-construct/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamfhs-new-vpc/test-construct/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -753,7 +755,7 @@ }, "Environment": { "Variables": { - "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehosenewvpcdestinationfirehoseEC1F5A2C" + "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehoselamfhsnewvpcdestinationfirehoseF2428936" } }, "Handler": "index.handler", @@ -825,7 +827,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc" + "Value": "lamfhs-new-vpc/Vpc" } ] } @@ -847,7 +849,7 @@ }, { "Key": "Name", - "Value": "new-vpc/Vpc/isolatedSubnet1" + "Value": "lamfhs-new-vpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -861,7 +863,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc/isolatedSubnet1" + "Value": "lamfhs-new-vpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -897,7 +899,7 @@ }, { "Key": "Name", - "Value": "new-vpc/Vpc/isolatedSubnet2" + "Value": "lamfhs-new-vpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -911,7 +913,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc/isolatedSubnet2" + "Value": "lamfhs-new-vpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -947,7 +949,7 @@ }, { "Key": "Name", - "Value": "new-vpc/Vpc/isolatedSubnet3" + "Value": "lamfhs-new-vpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -961,7 +963,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc/isolatedSubnet3" + "Value": "lamfhs-new-vpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -998,7 +1000,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc/FlowLog" + "Value": "lamfhs-new-vpc/Vpc/FlowLog" } ] } @@ -1050,7 +1052,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc/FlowLog" + "Value": "lamfhs-new-vpc/Vpc/FlowLog" } ] }, @@ -1087,7 +1089,7 @@ "Tags": [ { "Key": "Name", - "Value": "new-vpc/Vpc/FlowLog" + "Value": "lamfhs-new-vpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1100,7 +1102,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newvpcKINESISFIREHOSEsecuritygroup3F345517", + "lamfhsnewvpcKINESISFIREHOSEsecuritygroupDF50B55F", "GroupId" ] } @@ -1134,10 +1136,10 @@ } } }, - "newvpcKINESISFIREHOSEsecuritygroup3F345517": { + "lamfhsnewvpcKINESISFIREHOSEsecuritygroupDF50B55F": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "new-vpc/new-vpc-KINESIS_FIREHOSE-security-group", + "GroupDescription": "lamfhs-new-vpc/lamfhs-new-vpc-KINESIS_FIREHOSE-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-new-vpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.new-vpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-new-vpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-no-arguments.expected.json index 688ddcad6..090b8c134 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-no-arguments.expected.json @@ -85,6 +85,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -274,6 +275,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -466,7 +468,7 @@ "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehosenoargumentsdestinationfirehose5454CC08", + "DeliveryStreamName": "KinesisFirehoselamfhsnoargumentsdestinationfirehoseC6583242", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ @@ -550,7 +552,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -712,7 +714,7 @@ }, "Environment": { "Variables": { - "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehosenoargumentsdestinationfirehose5454CC08" + "FIREHOSE_DELIVERYSTREAM_NAME": "KinesisFirehoselamfhsnoargumentsdestinationfirehoseC6583242" } }, "Handler": "index.handler", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisfirehose/test/integ.lamfhs-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingLambda.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingLambda.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingLambda.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingLambda.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingLambda.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStream.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingStream.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStream.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingStream.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStream.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingStream.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStream.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingStream.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingStreamWithCmk.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingStreamWithCmk.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingStreamWithCmk.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingStreamWithCmk.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingStreamWithCmk.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingVpc.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingVpc.expected.json index bba6b14da..4561f899a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingVpc.expected.json @@ -10,7 +10,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "lamkin-existingVpc/Vpc" } ] } @@ -32,7 +32,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -56,7 +56,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -97,7 +97,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet1" } ] } @@ -117,7 +117,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet1" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet1" } ] }, @@ -143,7 +143,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -167,7 +167,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -208,7 +208,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet2" } ] } @@ -228,7 +228,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet2" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet2" } ] }, @@ -254,7 +254,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -278,7 +278,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -319,7 +319,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet3" } ] } @@ -339,7 +339,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PublicSubnet3" + "Value": "lamkin-existingVpc/Vpc/PublicSubnet3" } ] }, @@ -365,7 +365,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet1" + "Value": "lamkin-existingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -379,7 +379,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet1" + "Value": "lamkin-existingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -427,7 +427,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet2" + "Value": "lamkin-existingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -441,7 +441,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet2" + "Value": "lamkin-existingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -489,7 +489,7 @@ }, { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet3" + "Value": "lamkin-existingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -503,7 +503,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/PrivateSubnet3" + "Value": "lamkin-existingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc" + "Value": "lamkin-existingVpc/Vpc" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/FlowLog" + "Value": "lamkin-existingVpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/FlowLog" + "Value": "lamkin-existingVpc/Vpc/FlowLog" } ] }, @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "existingVpc/Vpc/FlowLog" + "Value": "lamkin-existingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -676,7 +676,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "existingVpcKINESISSTREAMSsecuritygroupDE0E9DB9", + "lamkinexistingVpcKINESISSTREAMSsecuritygroupC307369A", "GroupId" ] } @@ -827,7 +827,7 @@ "testlambdakinesisstreamsReplaceDefaultSecurityGroupsecuritygroupFB22266C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingVpc/test-lambda-kinesisstreams/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamkin-existingVpc/test-lambda-kinesisstreams/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -969,10 +969,10 @@ "Threshold": 0 } }, - "existingVpcKINESISSTREAMSsecuritygroupDE0E9DB9": { + "lamkinexistingVpcKINESISSTREAMSsecuritygroupC307369A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existingVpc/existingVpc-KINESIS_STREAMS-security-group", + "GroupDescription": "lamkin-existingVpc/lamkin-existingVpc-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.existingVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-existingVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newStreamFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newStreamFromProps.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newStreamFromProps.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newStreamFromProps.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newStreamFromProps.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newStreamFromProps.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newStreamFromProps.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newStreamFromProps.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpc.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpc.expected.json index 1eddf3e1e..4ff81e82c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpc.expected.json @@ -117,7 +117,7 @@ "testlambdakinesisstreamsReplaceDefaultSecurityGroupsecuritygroupFB22266C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "newVpc/test-lambda-kinesisstreams/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamkin-newVpc/test-lambda-kinesisstreams/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -266,7 +266,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc" + "Value": "lamkin-newVpc/Vpc" } ] } @@ -288,7 +288,7 @@ }, { "Key": "Name", - "Value": "newVpc/Vpc/isolatedSubnet1" + "Value": "lamkin-newVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -302,7 +302,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc/isolatedSubnet1" + "Value": "lamkin-newVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -338,7 +338,7 @@ }, { "Key": "Name", - "Value": "newVpc/Vpc/isolatedSubnet2" + "Value": "lamkin-newVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -352,7 +352,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc/isolatedSubnet2" + "Value": "lamkin-newVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -388,7 +388,7 @@ }, { "Key": "Name", - "Value": "newVpc/Vpc/isolatedSubnet3" + "Value": "lamkin-newVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -402,7 +402,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc/isolatedSubnet3" + "Value": "lamkin-newVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -439,7 +439,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc/FlowLog" + "Value": "lamkin-newVpc/Vpc/FlowLog" } ] } @@ -491,7 +491,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc/FlowLog" + "Value": "lamkin-newVpc/Vpc/FlowLog" } ] }, @@ -528,7 +528,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpc/Vpc/FlowLog" + "Value": "lamkin-newVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -541,7 +541,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newVpcKINESISSTREAMSsecuritygroup88F75AD5", + "lamkinnewVpcKINESISSTREAMSsecuritygroup5C800E5E", "GroupId" ] } @@ -575,10 +575,10 @@ } } }, - "newVpcKINESISSTREAMSsecuritygroup88F75AD5": { + "lamkinnewVpcKINESISSTREAMSsecuritygroup5C800E5E": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "newVpc/newVpc-KINESIS_STREAMS-security-group", + "GroupDescription": "lamkin-newVpc/lamkin-newVpc-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpcFromProps.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpcFromProps.expected.json index 398bfd9be..fb8e0369a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpcFromProps.expected.json @@ -117,7 +117,7 @@ "testlambdakinesisstreamsReplaceDefaultSecurityGroupsecuritygroupFB22266C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "newVpcFromProps/test-lambda-kinesisstreams/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamkin-newVpcFromProps/test-lambda-kinesisstreams/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -258,7 +258,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpcFromProps/Vpc" + "Value": "lamkin-newVpcFromProps/Vpc" } ] } @@ -280,7 +280,7 @@ }, { "Key": "Name", - "Value": "newVpcFromProps/Vpc/isolatedSubnet1" + "Value": "lamkin-newVpcFromProps/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -294,7 +294,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpcFromProps/Vpc/isolatedSubnet1" + "Value": "lamkin-newVpcFromProps/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -331,7 +331,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpcFromProps/Vpc/FlowLog" + "Value": "lamkin-newVpcFromProps/Vpc/FlowLog" } ] } @@ -383,7 +383,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpcFromProps/Vpc/FlowLog" + "Value": "lamkin-newVpcFromProps/Vpc/FlowLog" } ] }, @@ -420,7 +420,7 @@ "Tags": [ { "Key": "Name", - "Value": "newVpcFromProps/Vpc/FlowLog" + "Value": "lamkin-newVpcFromProps/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -433,7 +433,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "newVpcFromPropsKINESISSTREAMSsecuritygroup9B3EE931", + "lamkinnewVpcFromPropsKINESISSTREAMSsecuritygroup10DC8B01", "GroupId" ] } @@ -461,10 +461,10 @@ } } }, - "newVpcFromPropsKINESISSTREAMSsecuritygroup9B3EE931": { + "lamkinnewVpcFromPropsKINESISSTREAMSsecuritygroup10DC8B01": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "newVpcFromProps/newVpcFromProps-KINESIS_STREAMS-security-group", + "GroupDescription": "lamkin-newVpcFromProps/lamkin-newVpcFromProps-KINESIS_STREAMS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpcFromProps.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.newVpcFromProps.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-newVpcFromProps.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-noArguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-noArguments.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-noArguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.noArguments.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-kinesisstreams/test/integ.lamkin-noArguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-cluster-config.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-cluster-config.expected.json index 451416bce..91c2dcc33 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-cluster-config.expected.json @@ -103,7 +103,7 @@ "testlambdaopensearchReplaceDefaultSecurityGroupsecuritygroupB44718EC": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "cluster-config/test-lambda-opensearch/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamopn-cluster-config/test-lambda-opensearch/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -742,7 +742,7 @@ "Tags": [ { "Key": "Name", - "Value": "cluster-config/Vpc" + "Value": "lamopn-cluster-config/Vpc" } ] } @@ -764,7 +764,7 @@ }, { "Key": "Name", - "Value": "cluster-config/Vpc/isolatedSubnet1" + "Value": "lamopn-cluster-config/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -778,7 +778,7 @@ "Tags": [ { "Key": "Name", - "Value": "cluster-config/Vpc/isolatedSubnet1" + "Value": "lamopn-cluster-config/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -814,7 +814,7 @@ }, { "Key": "Name", - "Value": "cluster-config/Vpc/isolatedSubnet2" + "Value": "lamopn-cluster-config/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -828,7 +828,7 @@ "Tags": [ { "Key": "Name", - "Value": "cluster-config/Vpc/isolatedSubnet2" + "Value": "lamopn-cluster-config/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -865,7 +865,7 @@ "Tags": [ { "Key": "Name", - "Value": "cluster-config/Vpc/FlowLog" + "Value": "lamopn-cluster-config/Vpc/FlowLog" } ] } @@ -917,7 +917,7 @@ "Tags": [ { "Key": "Name", - "Value": "cluster-config/Vpc/FlowLog" + "Value": "lamopn-cluster-config/Vpc/FlowLog" } ] }, @@ -954,7 +954,7 @@ "Tags": [ { "Key": "Name", - "Value": "cluster-config/Vpc/FlowLog" + "Value": "lamopn-cluster-config/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-cluster-config.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.cluster-config.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-cluster-config.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-disabled-zone-awareness.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-disabled-zone-awareness.expected.json index bacca0a29..21a55d6b6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-disabled-zone-awareness.expected.json @@ -103,7 +103,7 @@ "testlambdaopensearchReplaceDefaultSecurityGroupsecuritygroupB44718EC": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "disabled-zone-awareness/test-lambda-opensearch/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamopn-disabled-zone-awareness/test-lambda-opensearch/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -732,7 +732,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabled-zone-awareness/Vpc" + "Value": "lamopn-disabled-zone-awareness/Vpc" } ] } @@ -754,7 +754,7 @@ }, { "Key": "Name", - "Value": "disabled-zone-awareness/Vpc/isolatedSubnet1" + "Value": "lamopn-disabled-zone-awareness/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -768,7 +768,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabled-zone-awareness/Vpc/isolatedSubnet1" + "Value": "lamopn-disabled-zone-awareness/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -805,7 +805,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabled-zone-awareness/Vpc/FlowLog" + "Value": "lamopn-disabled-zone-awareness/Vpc/FlowLog" } ] } @@ -857,7 +857,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabled-zone-awareness/Vpc/FlowLog" + "Value": "lamopn-disabled-zone-awareness/Vpc/FlowLog" } ] }, @@ -894,7 +894,7 @@ "Tags": [ { "Key": "Name", - "Value": "disabled-zone-awareness/Vpc/FlowLog" + "Value": "lamopn-disabled-zone-awareness/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-disabled-zone-awareness.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.disabled-zone-awareness.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-disabled-zone-awareness.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-domain-arguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-domain-arguments.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-domain-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.domain-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-domain-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-existing-vpc.expected.json similarity index 96% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-existing-vpc.expected.json index 3115d78a4..c8c5b4dff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-existing-vpc.expected.json @@ -10,7 +10,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "lamopn-existing-vpc/Vpc" } ] } @@ -32,7 +32,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet1" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -56,7 +56,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet1" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -97,7 +97,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet1" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet1" } ] } @@ -117,7 +117,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet1" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet1" } ] }, @@ -143,7 +143,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet2" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -167,7 +167,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet2" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -208,7 +208,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet2" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet2" } ] } @@ -228,7 +228,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet2" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet2" } ] }, @@ -254,7 +254,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet3" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -278,7 +278,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet3" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -319,7 +319,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet3" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet3" } ] } @@ -339,7 +339,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PublicSubnet3" + "Value": "lamopn-existing-vpc/Vpc/PublicSubnet3" } ] }, @@ -365,7 +365,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet1" + "Value": "lamopn-existing-vpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -379,7 +379,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet1" + "Value": "lamopn-existing-vpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -427,7 +427,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet2" + "Value": "lamopn-existing-vpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -441,7 +441,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet2" + "Value": "lamopn-existing-vpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -489,7 +489,7 @@ }, { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet3" + "Value": "lamopn-existing-vpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -503,7 +503,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/PrivateSubnet3" + "Value": "lamopn-existing-vpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc" + "Value": "lamopn-existing-vpc/Vpc" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/FlowLog" + "Value": "lamopn-existing-vpc/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/FlowLog" + "Value": "lamopn-existing-vpc/Vpc/FlowLog" } ] }, @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "existing-vpc/Vpc/FlowLog" + "Value": "lamopn-existing-vpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -772,7 +772,7 @@ "testlambdaelasticsearchkibana4ReplaceDefaultSecurityGroupsecuritygroupA79E2B92": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "existing-vpc/test-lambda-elasticsearch-kibana4/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamopn-existing-vpc/test-lambda-elasticsearch-kibana4/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-existing-vpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.existing-vpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-existing-vpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-no-arguments.expected.json index bb4aceef8..43b70f2ed 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-no-arguments.expected.json @@ -227,7 +227,7 @@ "testlambdaopensearchUserPoolDomain98864920": { "Type": "AWS::Cognito::UserPoolDomain", "Properties": { - "Domain": "solutions-constructs-domain", + "Domain": "lamopn-no-args", "UserPoolId": { "Ref": "testlambdaopensearchCognitoUserPoolA09096F9" } @@ -284,7 +284,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/solutions-constructs-domain/*" + ":domain/lamopn-no-args/*" ] ] } @@ -397,7 +397,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/solutions-constructs-domain" + ":domain/lamopn-no-args" ] ] } @@ -469,7 +469,7 @@ { "Ref": "AWS::AccountId" }, - ":domain/solutions-constructs-domain/*" + ":domain/lamopn-no-args/*" ] ] } @@ -505,7 +505,7 @@ "EnforceHTTPS": true, "TLSSecurityPolicy": "Policy-Min-TLS-1-2-2019-07" }, - "DomainName": "solutions-constructs-domain", + "DomainName": "lamopn-no-args", "EBSOptions": { "EBSEnabled": true, "VolumeSize": 10 diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-no-arguments.ts similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-no-arguments.ts index 8330476a9..af1e5450d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-no-arguments.ts @@ -27,7 +27,7 @@ const lambdaProps: lambda.FunctionProps = { handler: 'index.handler' }; -const openSearchDomain = 'solutions-constructs-domain'; +const openSearchDomain = 'lamopn-no-args'; new LambdaToOpenSearch(stack, 'test-lambda-opensearch', { lambdaFunctionProps: lambdaProps, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-vpc-props.expected.json similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-vpc-props.expected.json index 21ebb11c4..e0178d93b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-vpc-props.expected.json @@ -103,7 +103,7 @@ "testlambdaopensearchReplaceDefaultSecurityGroupsecuritygroupB44718EC": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "vpc-props/test-lambda-opensearch/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamopn-vpc-props/test-lambda-opensearch/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -747,7 +747,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc" + "Value": "lamopn-vpc-props/Vpc" } ] } @@ -769,7 +769,7 @@ }, { "Key": "Name", - "Value": "vpc-props/Vpc/isolatedSubnet1" + "Value": "lamopn-vpc-props/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -783,7 +783,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc/isolatedSubnet1" + "Value": "lamopn-vpc-props/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -819,7 +819,7 @@ }, { "Key": "Name", - "Value": "vpc-props/Vpc/isolatedSubnet2" + "Value": "lamopn-vpc-props/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -833,7 +833,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc/isolatedSubnet2" + "Value": "lamopn-vpc-props/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -869,7 +869,7 @@ }, { "Key": "Name", - "Value": "vpc-props/Vpc/isolatedSubnet3" + "Value": "lamopn-vpc-props/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -883,7 +883,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc/isolatedSubnet3" + "Value": "lamopn-vpc-props/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -920,7 +920,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc/FlowLog" + "Value": "lamopn-vpc-props/Vpc/FlowLog" } ] } @@ -972,7 +972,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc/FlowLog" + "Value": "lamopn-vpc-props/Vpc/FlowLog" } ] }, @@ -1009,7 +1009,7 @@ "Tags": [ { "Key": "Name", - "Value": "vpc-props/Vpc/FlowLog" + "Value": "lamopn-vpc-props/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-vpc-props.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.vpc-props.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-opensearch/test/integ.lamopn-vpc-props.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.expected.json similarity index 77% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.expected.json index 486e68be1..456eb1e61 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.expected.json @@ -197,6 +197,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -256,6 +262,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testlambdas3S3LoggingBucketD42FC73D", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testlambdas3S3LoggingBucketD42FC73D", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -297,6 +342,25 @@ } } }, + "testlambdas3S3LoggingBucketAutoDeleteObjectsCustomResource9AE70F3A": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testlambdas3S3LoggingBucketD42FC73D" + } + }, + "DependsOn": [ + "testlambdas3S3LoggingBucketPolicyCEAFB213" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testlambdas3S3Bucket179A52E6": { "Type": "AWS::S3::Bucket", "Properties": { @@ -386,6 +450,64 @@ "Version": "2012-10-17" } } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "testlambdas3S3LoggingBucketD42FC73D" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.ts similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.ts index fa78562bc..2a4a7364c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.ts @@ -34,6 +34,7 @@ new LambdaToS3(stack, 'test-lambda-s3', { }, loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, bucketName: 'custom-logging-bucket', encryption: BucketEncryption.S3_MANAGED, versioned: true diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-deployFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-deployFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-deployFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-deployFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-deployFunctionWithVpc.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-deployFunctionWithVpc.expected.json index 299acbe25..4d13d0f19 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-deployFunctionWithVpc.expected.json @@ -141,7 +141,7 @@ "testlambdas3ReplaceDefaultSecurityGroupsecuritygroupA1E3F673": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/test-lambda-s3/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lams3-deployFunctionWithVpc/test-lambda-s3/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -349,7 +349,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "lams3-deployFunctionWithVpc/Vpc" } ] } @@ -371,7 +371,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lams3-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -385,7 +385,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lams3-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -421,7 +421,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lams3-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -435,7 +435,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lams3-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -471,7 +471,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lams3-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -485,7 +485,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lams3-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -522,7 +522,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lams3-deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lams3-deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -611,7 +611,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lams3-deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-deployFunctionWithVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.deployFunctionWithVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-deployFunctionWithVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-existingFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-existingFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-existingFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.existingFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-existingFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-pre-existing-bucket.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-pre-existing-bucket.expected.json index 03aafe278..e9c101292 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-pre-existing-bucket.expected.json @@ -54,6 +54,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -143,7 +144,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-pre-existing-bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.pre-existing-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-pre-existing-bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithExistingVpc.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithExistingVpc.expected.json index 00399cbea..3e36236a0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithExistingVpc.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamsec-deployFunctionWithExistingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "deployFunctionWithExistingVpcSECRETSMANAGERsecuritygroupB20BA3EB", + "lamsecdeployFunctionWithExistingVpcSECRETSMANAGERsecuritygroup30E54F0F", "GroupId" ] } @@ -824,7 +824,7 @@ "testlambdasecretsmanagerstackReplaceDefaultSecurityGroupsecuritygroupBBE9275E": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithExistingVpc/test-lambda-secretsmanager-stack/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamsec-deployFunctionWithExistingVpc/test-lambda-secretsmanager-stack/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -948,10 +948,10 @@ } } }, - "deployFunctionWithExistingVpcSECRETSMANAGERsecuritygroupB20BA3EB": { + "lamsecdeployFunctionWithExistingVpcSECRETSMANAGERsecuritygroup30E54F0F": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithExistingVpc/deployFunctionWithExistingVpc-SECRETS_MANAGER-security-group", + "GroupDescription": "lamsec-deployFunctionWithExistingVpc/lamsec-deployFunctionWithExistingVpc-SECRETS_MANAGER-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithExistingVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithExistingVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithExistingVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithVpc.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithVpc.expected.json index 14093b327..656b42ee7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithVpc.expected.json @@ -114,7 +114,7 @@ "testlambdasecretsmanagerReplaceDefaultSecurityGroupsecuritygroupF837FD37": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/test-lambda-secretsmanager/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamsec-deployFunctionWithVpc/test-lambda-secretsmanager/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -245,7 +245,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "lamsec-deployFunctionWithVpc/Vpc" } ] } @@ -267,7 +267,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamsec-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -281,7 +281,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamsec-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -317,7 +317,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamsec-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -331,7 +331,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamsec-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -367,7 +367,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamsec-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -381,7 +381,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamsec-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -418,7 +418,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamsec-deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -470,7 +470,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamsec-deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -507,7 +507,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamsec-deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -520,7 +520,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "deployFunctionWithVpcSECRETSMANAGERsecuritygroup140A8C59", + "lamsecdeployFunctionWithVpcSECRETSMANAGERsecuritygroup98862008", "GroupId" ] } @@ -554,10 +554,10 @@ } } }, - "deployFunctionWithVpcSECRETSMANAGERsecuritygroup140A8C59": { + "lamsecdeployFunctionWithVpcSECRETSMANAGERsecuritygroup98862008": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/deployFunctionWithVpc-SECRETS_MANAGER-security-group", + "GroupDescription": "lamsec-deployFunctionWithVpc/lamsec-deployFunctionWithVpc-SECRETS_MANAGER-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.deployFunctionWithVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-deployFunctionWithVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-existingFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-existingFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-existingFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.existingFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/integ.lamsec-existingFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-deployFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-deployFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-deployFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-deployFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-deployFunctionWithVpc.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-deployFunctionWithVpc.expected.json index fac38e6c5..1a1afe45a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-deployFunctionWithVpc.expected.json @@ -111,7 +111,7 @@ "testlambdasnsReplaceDefaultSecurityGroupsecuritygroup071D13CB": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/test-lambda-sns/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamsns-deployFunctionWithVpc/test-lambda-sns/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -339,7 +339,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "lamsns-deployFunctionWithVpc/Vpc" } ] } @@ -361,7 +361,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamsns-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -375,7 +375,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamsns-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -411,7 +411,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamsns-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -425,7 +425,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamsns-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -461,7 +461,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamsns-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -475,7 +475,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamsns-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -512,7 +512,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamsns-deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -564,7 +564,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamsns-deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -601,7 +601,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamsns-deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -614,7 +614,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "deployFunctionWithVpcSNSsecuritygroup5E54C413", + "lamsnsdeployFunctionWithVpcSNSsecuritygroup072F337C", "GroupId" ] } @@ -648,10 +648,10 @@ } } }, - "deployFunctionWithVpcSNSsecuritygroup5E54C413": { + "lamsnsdeployFunctionWithVpcSNSsecuritygroup072F337C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/deployFunctionWithVpc-SNS-security-group", + "GroupDescription": "lamsns-deployFunctionWithVpc/lamsns-deployFunctionWithVpc-SNS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-deployFunctionWithVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.deployFunctionWithVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-deployFunctionWithVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-existingFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-existingFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-existingFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.existingFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sns/test/integ.lamsns-existingFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-defaultDeployment.expected.json old mode 100755 new mode 100644 similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-defaultDeployment.expected.json index d1e2e4d6e..10e28137d --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-defaultDeployment.expected.json @@ -477,7 +477,7 @@ } } }, - "testlambdasqslambdasqstolambdaLambdaFunctionSqsEventSourcedefaultDeploymenttestlambdasqslambdalambdatosqsqueue5E928C6A3AD18AD6": { + "testlambdasqslambdasqstolambdaLambdaFunctionSqsEventSourcelamsqslamdefaultDeploymenttestlambdasqslambdalambdatosqsqueue3E64D9566563B998": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "EventSourceArn": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-defaultDeployment.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.defaultDeployment.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-defaultDeployment.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-deployProducerFunctionWithVpc.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-deployProducerFunctionWithVpc.expected.json index 0118c94c6..b242e72f1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-deployProducerFunctionWithVpc.expected.json @@ -118,7 +118,7 @@ "testlambdasqslambdatosqsReplaceDefaultSecurityGroupsecuritygroupD9549651": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployProducerFunctionWithVpc/test-lambda-sqs/lambda-to-sqs/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/lambda-to-sqs/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -398,7 +398,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc" } ] } @@ -420,7 +420,7 @@ }, { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet1" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -434,7 +434,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet1" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -470,7 +470,7 @@ }, { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet2" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -484,7 +484,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet2" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -520,7 +520,7 @@ }, { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet3" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -534,7 +534,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet3" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -571,7 +571,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/FlowLog" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/FlowLog" } ] } @@ -623,7 +623,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/FlowLog" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/FlowLog" } ] }, @@ -660,7 +660,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/FlowLog" + "Value": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -710,7 +710,7 @@ "testlambdasqstestlambdasqsSQSsecuritygroupBDBA458D": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployProducerFunctionWithVpc/test-lambda-sqs/test-lambda-sqs-SQS-security-group", + "GroupDescription": "lamsqslam-deployProducerFunctionWithVpc/test-lambda-sqs/test-lambda-sqs-SQS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -919,7 +919,7 @@ } } }, - "testlambdasqssqstolambdaLambdaFunctionSqsEventSourcedeployProducerFunctionWithVpctestlambdasqslambdatosqsqueueA1382C56CEF2BFAB": { + "testlambdasqssqstolambdaLambdaFunctionSqsEventSourcelamsqslamdeployProducerFunctionWithVpctestlambdasqslambdatosqsqueueD62DE11EB9A24E09": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "EventSourceArn": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-deployProducerFunctionWithVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.deployProducerFunctionWithVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-deployProducerFunctionWithVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingConsumerFunction.expected.json old mode 100755 new mode 100644 similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingConsumerFunction.expected.json index f3c39b316..b9d93247a --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingConsumerFunction.expected.json @@ -155,7 +155,7 @@ } } }, - "LambdaFunctionSqsEventSourceexistingConsumerFunctiontestlambdasqslambdalambdatosqsqueue06632F2BBBBAB968": { + "LambdaFunctionSqsEventSourcelamsqslamexistingConsumerFunctiontestlambdasqslambdalambdatosqsqueueADB261AF57113DBC": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "EventSourceArn": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingConsumerFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingConsumerFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingConsumerFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingProducerFunction.expected.json old mode 100755 new mode 100644 similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingProducerFunction.expected.json index db615ee83..fbff99899 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingProducerFunction.expected.json @@ -477,7 +477,7 @@ } } }, - "testlambdasqslambdasqstolambdaLambdaFunctionSqsEventSourceexistingProducerFunctiontestlambdasqslambdalambdatosqsqueue9043AC9D03EA33DA": { + "testlambdasqslambdasqstolambdaLambdaFunctionSqsEventSourcelamsqslamexistingProducerFunctiontestlambdasqslambdalambdatosqsqueue8D69F5FDF7993E28": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "EventSourceArn": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingProducerFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingProducerFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingProducerFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingQueue.expected.json old mode 100755 new mode 100644 similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingQueue.expected.json index 0adc3d1f2..7f18cd4e7 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingQueue.expected.json @@ -389,7 +389,7 @@ } } }, - "testlambdasqslambdasqstolambdaLambdaFunctionSqsEventSourceexistingQueueexistingsqsqueue05DEA3674B910AAB": { + "testlambdasqslambdasqstolambdaLambdaFunctionSqsEventSourcelamsqslamexistingQueueexistingsqsqueue9D244BAE1189AC7F": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "EventSourceArn": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingQueue.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.existingQueue.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs-lambda/test/integ.lamsqslam-existingQueue.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunction.expected.json old mode 100755 new mode 100644 similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunctionWithVpc.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunctionWithVpc.expected.json index 3aea6b351..500ea1b29 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunctionWithVpc.expected.json @@ -118,7 +118,7 @@ "testlambdasqsReplaceDefaultSecurityGroupsecuritygroup2CA205C7": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/test-lambda-sqs/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamsqs-deployFunctionWithVpc/test-lambda-sqs/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -398,7 +398,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "lamsqs-deployFunctionWithVpc/Vpc" } ] } @@ -420,7 +420,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamsqs-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -434,7 +434,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamsqs-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -470,7 +470,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamsqs-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -484,7 +484,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamsqs-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -520,7 +520,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamsqs-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -534,7 +534,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamsqs-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -571,7 +571,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamsqs-deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -623,7 +623,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamsqs-deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -660,7 +660,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamsqs-deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -673,7 +673,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "deployFunctionWithVpcSQSsecuritygroup2E4E2685", + "lamsqsdeployFunctionWithVpcSQSsecuritygroupE4F67F17", "GroupId" ] } @@ -707,10 +707,10 @@ } } }, - "deployFunctionWithVpcSQSsecuritygroup2E4E2685": { + "lamsqsdeployFunctionWithVpcSQSsecuritygroupE4F67F17": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/deployFunctionWithVpc-SQS-security-group", + "GroupDescription": "lamsqs-deployFunctionWithVpc/lamsqs-deployFunctionWithVpc-SQS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunctionWithVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunctionWithVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunctionWithVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-existingFunction.expected.json old mode 100755 new mode 100644 similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-existingFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-existingFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-existingFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithExistingVpc.expected.json similarity index 92% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithExistingVpc.expected.json index 47c986943..52608f163 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithExistingVpc.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet1" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet2" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PublicSubnet3" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithExistingVpc/Vpc/FlowLog" + "Value": "lamssm-deployFunctionWithExistingVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -677,7 +677,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "deployFunctionWithExistingVpcSSMsecuritygroupC287F479", + "lamssmdeployFunctionWithExistingVpcSSMsecuritygroup091BDDCC", "GroupId" ] } @@ -846,7 +846,7 @@ "testlambdassmstringparameterReplaceDefaultSecurityGroupsecuritygroupBB1CB03C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithExistingVpc/test-lambda-ssmstringparameter/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamssm-deployFunctionWithExistingVpc/test-lambda-ssmstringparameter/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -959,10 +959,10 @@ "Value": "test-string-value" } }, - "deployFunctionWithExistingVpcSSMsecuritygroupC287F479": { + "lamssmdeployFunctionWithExistingVpcSSMsecuritygroup091BDDCC": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithExistingVpc/deployFunctionWithExistingVpc-SSM-security-group", + "GroupDescription": "lamssm-deployFunctionWithExistingVpc/lamssm-deployFunctionWithExistingVpc-SSM-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithExistingVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithExistingVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithExistingVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithVpc.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithVpc.expected.json index 785fe73e6..185f0ebc8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithVpc.expected.json @@ -136,7 +136,7 @@ "testlambdassmstringparameterReplaceDefaultSecurityGroupsecuritygroupBB1CB03C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/test-lambda-ssmstringparameter/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamssm-deployFunctionWithVpc/test-lambda-ssmstringparameter/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -256,7 +256,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "lamssm-deployFunctionWithVpc/Vpc" } ] } @@ -278,7 +278,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamssm-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -292,7 +292,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamssm-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -328,7 +328,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamssm-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -342,7 +342,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamssm-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -378,7 +378,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamssm-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -392,7 +392,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamssm-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -429,7 +429,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamssm-deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -481,7 +481,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamssm-deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -518,7 +518,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamssm-deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -531,7 +531,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "deployFunctionWithVpcSSMsecuritygroup918CB15C", + "lamssmdeployFunctionWithVpcSSMsecuritygroup40CF2829", "GroupId" ] } @@ -565,10 +565,10 @@ } } }, - "deployFunctionWithVpcSSMsecuritygroup918CB15C": { + "lamssmdeployFunctionWithVpcSSMsecuritygroup40CF2829": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/deployFunctionWithVpc-SSM-security-group", + "GroupDescription": "lamssm-deployFunctionWithVpc/lamssm-deployFunctionWithVpc-SSM-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.deployFunctionWithVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-deployFunctionWithVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-existingFunction.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-existingFunction.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-existingFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-existingFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-existingStringParameter.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-existingStringParameter.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-existingStringParameter.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.existingStringParameter.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-ssmstringparameter/test/integ.lamssm-existingStringParameter.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deploy-lambda.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deploy-lambda.expected.json index 251c1aca8..5e3c597f8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deploy-lambda.expected.json @@ -7,7 +7,7 @@ "Fn::Join": [ "", [ - "/aws/vendedlogs/states/constructs/deploy-lambdatest-lambda-stepfunctions-constructStateMachineLog-", + "/aws/vendedlogs/states/constructs/lamstp-deploy-lambdatest-lambda-stepfunctions-constructStateMachineLog-", { "Fn::Select": [ 2, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deploy-lambda.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deploy-lambda.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deploy-lambda.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.expected.json index 4f7f845e8..4a4691fc8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.expected.json @@ -256,7 +256,7 @@ "testlambdastepfunctionsReplaceDefaultSecurityGroupsecuritygroup3E86407A": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/test-lambda-stepfunctions/ReplaceDefaultSecurityGroup-security-group", + "GroupDescription": "lamstp-deployFunctionWithVpc/test-lambda-stepfunctions/ReplaceDefaultSecurityGroup-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -432,7 +432,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc" + "Value": "lamstp-deployFunctionWithVpc/Vpc" } ] } @@ -454,7 +454,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamstp-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -468,7 +468,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet1" + "Value": "lamstp-deployFunctionWithVpc/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -504,7 +504,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamstp-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -518,7 +518,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet2" + "Value": "lamstp-deployFunctionWithVpc/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -554,7 +554,7 @@ }, { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamstp-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -568,7 +568,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/isolatedSubnet3" + "Value": "lamstp-deployFunctionWithVpc/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -605,7 +605,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamstp-deployFunctionWithVpc/Vpc/FlowLog" } ] } @@ -657,7 +657,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamstp-deployFunctionWithVpc/Vpc/FlowLog" } ] }, @@ -694,7 +694,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployFunctionWithVpc/Vpc/FlowLog" + "Value": "lamstp-deployFunctionWithVpc/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -707,7 +707,7 @@ "SecurityGroupIds": [ { "Fn::GetAtt": [ - "deployFunctionWithVpcSTEPFUNCTIONSsecuritygroupA9CFA360", + "lamstpdeployFunctionWithVpcSTEPFUNCTIONSsecuritygroupC6950841", "GroupId" ] } @@ -741,10 +741,10 @@ } } }, - "deployFunctionWithVpcSTEPFUNCTIONSsecuritygroupA9CFA360": { + "lamstpdeployFunctionWithVpcSTEPFUNCTIONSsecuritygroupC6950841": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "deployFunctionWithVpc/deployFunctionWithVpc-STEP_FUNCTIONS-security-group", + "GroupDescription": "lamstp-deployFunctionWithVpc/lamstp-deployFunctionWithVpc-STEP_FUNCTIONS-security-group", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.deployFunctionWithVpc.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.expected.json rename to source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.existing-function.ts rename to source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetExistingLambdaFunctions.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetExistingLambdaFunctions.expected.json index 90ce56cf6..0778d1a11 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetExistingLambdaFunctions.expected.json @@ -671,7 +671,7 @@ }, "S3Key": "7382a0addb9f34974a1ea6c6c9b063882af874828f366f5c93b2b7b64db15c94.zip" }, - "Description": "AWS CDK resource provider framework - onEvent (apiFromAssetExistingLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", + "Description": "AWS CDK resource provider framework - onEvent (opilam-apiFromAssetExistingLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", "Environment": { "Variables": { "USER_ON_EVENT_FUNCTION_ARN": { diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetExistingLambdaFunctions.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetExistingLambdaFunctions.ts rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetExistingLambdaFunctions.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.expected.json index 22cc311a0..e3332f80b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.expected.json @@ -670,7 +670,7 @@ }, "S3Key": "7382a0addb9f34974a1ea6c6c9b063882af874828f366f5c93b2b7b64db15c94.zip" }, - "Description": "AWS CDK resource provider framework - onEvent (apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", + "Description": "AWS CDK resource provider framework - onEvent (opilam-apiFromAssetNewLambdaFunctions/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", "Environment": { "Variables": { "USER_ON_EVENT_FUNCTION_ARN": { diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetNewLambdaFunctions.ts rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetNewLambdaFunctions.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetWithCognitoAuth.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetWithCognitoAuth.expected.json index c888345b9..baa7e97c8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetWithCognitoAuth.expected.json @@ -670,7 +670,7 @@ }, "S3Key": "7382a0addb9f34974a1ea6c6c9b063882af874828f366f5c93b2b7b64db15c94.zip" }, - "Description": "AWS CDK resource provider framework - onEvent (apiFromAssetWithCognitoAuth/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", + "Description": "AWS CDK resource provider framework - onEvent (opilam-apiFromAssetWithCognitoAuth/OpenApiGatewayToLambda/ApiTemplateWriterProvider)", "Environment": { "Variables": { "USER_ON_EVENT_FUNCTION_ARN": { diff --git a/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.ts b/source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetWithCognitoAuth.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.apiFromAssetWithCognitoAuth.ts rename to source/patterns/@aws-solutions-constructs/aws-openapigateway-lambda/test/integ.opilam-apiFromAssetWithCognitoAuth.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApi.expected.json similarity index 95% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApi.expected.json index 5d0d3bb46..d7914c06c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApi.expected.json @@ -69,7 +69,7 @@ "privateapistackprivateapistackalbSecurityGroup5A8A9725": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB deployPrivateApiprivateapistackprivateapistackalb5DF93E18", + "GroupDescription": "Automatically created Security Group for ELB r53albdeployPrivateApiprivateapistackprivateapistackalb2321F60F", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -184,6 +184,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -365,7 +366,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc" + "Value": "r53alb-deployPrivateApi/Vpc" } ] } @@ -387,7 +388,7 @@ }, { "Key": "Name", - "Value": "deployPrivateApi/Vpc/isolatedSubnet1" + "Value": "r53alb-deployPrivateApi/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -401,7 +402,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc/isolatedSubnet1" + "Value": "r53alb-deployPrivateApi/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -437,7 +438,7 @@ }, { "Key": "Name", - "Value": "deployPrivateApi/Vpc/isolatedSubnet2" + "Value": "r53alb-deployPrivateApi/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -451,7 +452,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc/isolatedSubnet2" + "Value": "r53alb-deployPrivateApi/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -487,7 +488,7 @@ }, { "Key": "Name", - "Value": "deployPrivateApi/Vpc/isolatedSubnet3" + "Value": "r53alb-deployPrivateApi/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -501,7 +502,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc/isolatedSubnet3" + "Value": "r53alb-deployPrivateApi/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -538,7 +539,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc/FlowLog" + "Value": "r53alb-deployPrivateApi/Vpc/FlowLog" } ] } @@ -590,7 +591,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc/FlowLog" + "Value": "r53alb-deployPrivateApi/Vpc/FlowLog" } ] }, @@ -627,7 +628,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApi/Vpc/FlowLog" + "Value": "r53alb-deployPrivateApi/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -662,7 +663,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.ts b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApi.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.ts rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApi.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApiExistingZone.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApiExistingZone.expected.json index 3a56327aa..f9c5f5b23 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApiExistingZone.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet1" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet1" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet1" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet1" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet2" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet2" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet2" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet2" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet3" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet3" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet3" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PublicSubnet3" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet1" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet1" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet2" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet2" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet3" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/PrivateSubnet3" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/FlowLog" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/FlowLog" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPrivateApiExistingZone/Vpc/FlowLog" + "Value": "r53alb-deployPrivateApiExistingZone/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -738,7 +738,7 @@ "existingzonestackexistingzonestackalbSecurityGroup6F32DCA5": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB deployPrivateApiExistingZoneexistingzonestackexistingzonestackalbFBEA12EB", + "GroupDescription": "Automatically created Security Group for ELB r53albdeployPrivateApiExistingZoneexistingzonestackexistingzonestackalb431F8644", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -853,6 +853,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -1053,7 +1054,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.ts b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApiExistingZone.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.ts rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApiExistingZone.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiExistingAlb.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiExistingAlb.expected.json similarity index 91% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiExistingAlb.expected.json rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiExistingAlb.expected.json index b9cf81aa1..52e62e99b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiExistingAlb.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiExistingAlb.expected.json @@ -11,7 +11,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc" } ] } @@ -33,7 +33,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet1" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet1" } ], "VpcId": { @@ -57,7 +57,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet1" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet1" } ], "VpcId": { @@ -98,7 +98,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet1" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet1" } ] } @@ -118,7 +118,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet1" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet1" } ] }, @@ -144,7 +144,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet2" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet2" } ], "VpcId": { @@ -168,7 +168,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet2" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet2" } ], "VpcId": { @@ -209,7 +209,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet2" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet2" } ] } @@ -229,7 +229,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet2" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet2" } ] }, @@ -255,7 +255,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet3" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet3" } ], "VpcId": { @@ -279,7 +279,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet3" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet3" } ], "VpcId": { @@ -320,7 +320,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet3" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet3" } ] } @@ -340,7 +340,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PublicSubnet3" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PublicSubnet3" } ] }, @@ -366,7 +366,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet1" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -380,7 +380,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet1" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -428,7 +428,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet2" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -442,7 +442,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet2" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -490,7 +490,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet3" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -504,7 +504,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/PrivateSubnet3" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -541,7 +541,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc" } ] } @@ -575,7 +575,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/FlowLog" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/FlowLog" } ] } @@ -627,7 +627,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/FlowLog" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/FlowLog" } ] }, @@ -664,7 +664,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiExistingAlb/Vpc/FlowLog" + "Value": "r53alb-deployPublicApiExistingAlb/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -721,7 +721,7 @@ "testalbSecurityGroup0C84CDF9": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB deployPublicApiExistingAlbtestalb700DF81E", + "GroupDescription": "Automatically created Security Group for ELB r53albdeployPublicApiExistingAlbtestalb4D355E36", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiExistingAlb.ts b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiExistingAlb.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiExistingAlb.ts rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiExistingAlb.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.expected.json index 609c4a6d2..3e0330483 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.expected.json @@ -67,7 +67,7 @@ "newalbstacknewalbstackalbSecurityGroup7BBB827C": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB deployPublicApiNewAlbnewalbstacknewalbstackalbC987D9E9", + "GroupDescription": "Automatically created Security Group for ELB r53albdeployPublicApiNewAlbnewalbstacknewalbstackalb11D1F44A", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -182,6 +182,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -363,7 +364,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc" + "Value": "r53alb-deployPublicApiNewAlb/Vpc" } ] } @@ -385,7 +386,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet1" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet1" } ], "VpcId": { @@ -409,7 +410,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet1" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet1" } ], "VpcId": { @@ -450,7 +451,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet1" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet1" } ] } @@ -470,7 +471,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet1" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet1" } ] }, @@ -496,7 +497,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet2" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet2" } ], "VpcId": { @@ -520,7 +521,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet2" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet2" } ], "VpcId": { @@ -561,7 +562,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet2" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet2" } ] } @@ -581,7 +582,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet2" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet2" } ] }, @@ -607,7 +608,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet3" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet3" } ], "VpcId": { @@ -631,7 +632,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet3" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet3" } ], "VpcId": { @@ -672,7 +673,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet3" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet3" } ] } @@ -692,7 +693,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PublicSubnet3" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PublicSubnet3" } ] }, @@ -718,7 +719,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet1" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -732,7 +733,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet1" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -780,7 +781,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet2" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -794,7 +795,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet2" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -842,7 +843,7 @@ }, { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet3" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -856,7 +857,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/PrivateSubnet3" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -893,7 +894,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc" + "Value": "r53alb-deployPublicApiNewAlb/Vpc" } ] } @@ -927,7 +928,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/FlowLog" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/FlowLog" } ] } @@ -979,7 +980,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/FlowLog" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/FlowLog" } ] }, @@ -1016,7 +1017,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployPublicApiNewAlb/Vpc/FlowLog" + "Value": "r53alb-deployPublicApiNewAlb/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -1051,7 +1052,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.ts b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.ts rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployWithoutLogging.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployWithoutLogging.expected.json similarity index 93% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployWithoutLogging.expected.json rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployWithoutLogging.expected.json index 47d84e1f8..3e7729ab5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployWithoutLogging.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployWithoutLogging.expected.json @@ -60,7 +60,7 @@ "nologgingstacknologgingstackalbSecurityGroup1C3487C4": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB deployWithoutLoggingnologgingstacknologgingstackalbBA718BE3", + "GroupDescription": "Automatically created Security Group for ELB r53albdeployWithoutLoggingnologgingstacknologgingstackalbB659CBAA", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", @@ -127,7 +127,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc" + "Value": "r53alb-deployWithoutLogging/Vpc" } ] } @@ -149,7 +149,7 @@ }, { "Key": "Name", - "Value": "deployWithoutLogging/Vpc/isolatedSubnet1" + "Value": "r53alb-deployWithoutLogging/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -163,7 +163,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc/isolatedSubnet1" + "Value": "r53alb-deployWithoutLogging/Vpc/isolatedSubnet1" } ], "VpcId": { @@ -199,7 +199,7 @@ }, { "Key": "Name", - "Value": "deployWithoutLogging/Vpc/isolatedSubnet2" + "Value": "r53alb-deployWithoutLogging/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -213,7 +213,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc/isolatedSubnet2" + "Value": "r53alb-deployWithoutLogging/Vpc/isolatedSubnet2" } ], "VpcId": { @@ -249,7 +249,7 @@ }, { "Key": "Name", - "Value": "deployWithoutLogging/Vpc/isolatedSubnet3" + "Value": "r53alb-deployWithoutLogging/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -263,7 +263,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc/isolatedSubnet3" + "Value": "r53alb-deployWithoutLogging/Vpc/isolatedSubnet3" } ], "VpcId": { @@ -300,7 +300,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc/FlowLog" + "Value": "r53alb-deployWithoutLogging/Vpc/FlowLog" } ] } @@ -352,7 +352,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc/FlowLog" + "Value": "r53alb-deployWithoutLogging/Vpc/FlowLog" } ] }, @@ -389,7 +389,7 @@ "Tags": [ { "Key": "Name", - "Value": "deployWithoutLogging/Vpc/FlowLog" + "Value": "r53alb-deployWithoutLogging/Vpc/FlowLog" } ], "TrafficType": "ALL" diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployWithoutLogging.ts b/source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployWithoutLogging.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployWithoutLogging.ts rename to source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployWithoutLogging.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.dummyTest.expected.json b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.r53api-dummyTest.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.dummyTest.expected.json rename to source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.r53api-dummyTest.expected.json index 5d969b002..5c8d7c7da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.dummyTest.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.r53api-dummyTest.expected.json @@ -34,10 +34,10 @@ "RestApiDeployment180EC50303f556aa2d7ddf6a650ba4d72f3e85ac": { "Type": "AWS::ApiGateway::Deployment", "Properties": { + "Description": "Automatically created by the RestApi construct", "RestApiId": { "Ref": "RestApi0C43BF4B" - }, - "Description": "Automatically created by the RestApi construct" + } }, "DependsOn": [ "RestApiGET0F59260B" @@ -56,9 +56,6 @@ "RestApiDeploymentStageprod3855DE66": { "Type": "AWS::ApiGateway::Stage", "Properties": { - "RestApiId": { - "Ref": "RestApi0C43BF4B" - }, "AccessLogSetting": { "DestinationArn": { "Fn::GetAtt": [ @@ -79,6 +76,9 @@ "ResourcePath": "/*" } ], + "RestApiId": { + "Ref": "RestApi0C43BF4B" + }, "StageName": "prod", "TracingEnabled": true } @@ -86,7 +86,11 @@ "RestApiGET0F59260B": { "Type": "AWS::ApiGateway::Method", "Properties": { + "AuthorizationType": "AWS_IAM", "HttpMethod": "GET", + "Integration": { + "Type": "MOCK" + }, "ResourceId": { "Fn::GetAtt": [ "RestApi0C43BF4B", @@ -95,10 +99,6 @@ }, "RestApiId": { "Ref": "RestApi0C43BF4B" - }, - "AuthorizationType": "AWS_IAM", - "Integration": { - "Type": "MOCK" } } }, @@ -254,4 +254,4 @@ ] } } -} +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.dummyTest.ts b/source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.r53api-dummyTest.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.dummyTest.ts rename to source/patterns/@aws-solutions-constructs/aws-route53-apigateway/test/integ.r53api-dummyTest.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-existing-s3-bucket.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-existing-s3-bucket.expected.json index dfad072b0..261450cc1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-existing-s3-bucket.expected.json @@ -53,6 +53,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -143,10 +144,10 @@ "Managed": true }, "DependsOn": [ - "scrapBucketAllowBucketNotificationsToexistings3buckettests3lambdaLambdaFunction4D270585E171492B" + "scrapBucketAllowBucketNotificationsTos3lamexistings3buckettests3lambdaLambdaFunctionCA1AFC4CBBE7A87C" ] }, - "scrapBucketAllowBucketNotificationsToexistings3buckettests3lambdaLambdaFunction4D270585E171492B": { + "scrapBucketAllowBucketNotificationsTos3lamexistings3buckettests3lambdaLambdaFunctionCA1AFC4CBBE7A87C": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -197,7 +198,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-existing-s3-bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-existing-s3-bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.expected.json similarity index 84% rename from source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.expected.json index 400d8c050..14829492d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.expected.json @@ -156,6 +156,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -215,6 +221,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3lambdaS3LoggingBucket0C3BBFDC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3lambdaS3LoggingBucket0C3BBFDC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -256,6 +301,25 @@ } } }, + "tests3lambdaS3LoggingBucketAutoDeleteObjectsCustomResource323E9779": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3lambdaS3LoggingBucket0C3BBFDC" + } + }, + "DependsOn": [ + "tests3lambdaS3LoggingBucketPolicyC349F74C" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3lambdaS3BucketBE7C1B8E": { "Type": "AWS::S3::Bucket", "Properties": { @@ -386,10 +450,10 @@ "Managed": true }, "DependsOn": [ - "tests3lambdaS3BucketAllowBucketNotificationsTonoargumentstests3lambdaLambdaFunction865C51D19BEA6368" + "tests3lambdaS3BucketAllowBucketNotificationsTos3lamnoargumentstests3lambdaLambdaFunction7F4DB5A1D2077883" ] }, - "tests3lambdaS3BucketAllowBucketNotificationsTonoargumentstests3lambdaLambdaFunction865C51D19BEA6368": { + "tests3lambdaS3BucketAllowBucketNotificationsTos3lamnoargumentstests3lambdaLambdaFunction7F4DB5A1D2077883": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -411,6 +475,64 @@ } } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3lambdaS3LoggingBucket0C3BBFDC" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.ts similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.ts index f63575983..3fcd7b43c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.ts @@ -34,6 +34,7 @@ const props: S3ToLambdaProps = { removalPolicy: RemovalPolicy.DESTROY, }, loggingBucketProps: { + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, }, }; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.expected.json similarity index 84% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.expected.json index 678527ff8..6c646d326 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.expected.json @@ -18,6 +18,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -77,6 +83,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -118,6 +163,25 @@ } } }, + "tests3snsS3LoggingBucketAutoDeleteObjectsCustomResourceFEE6B95B": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + } + }, + "DependsOn": [ + "tests3snsS3LoggingBucketPolicyA32283D9" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3Bucket4CA10A65": { "Type": "AWS::S3::Bucket", "Properties": { @@ -402,6 +466,64 @@ ] } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.ts similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.ts index 7b733b49c..e4191fcab 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.ts @@ -24,6 +24,7 @@ new S3ToSns(stack, 'test-s3-sns', { removalPolicy: RemovalPolicy.DESTROY }, loggingBucketProps: { + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY } }); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingS3Bucket.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingS3Bucket.expected.json index a21e54624..205169da2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingS3Bucket.expected.json @@ -53,6 +53,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -173,7 +174,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingS3Bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingS3Bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingS3Bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingSnsTopic.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingUnencryptedSnsTopic.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingUnencryptedSnsTopic.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingUnencryptedSnsTopic.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.existingUnencryptedSnsTopic.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.newTopicFromProps.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.customLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.noArguments.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3EventTypesAndFilters.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.snsTopicWithAwsManagedKey.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.snsTopicWithAwsManagedKey.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.snsTopicWithAwsManagedKey.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.snsTopicWithAwsManagedKey.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.creatingNewQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.creatingNewQueue.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.creatingNewQueue.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.creatingNewQueue.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json similarity index 86% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json index a6927de0a..ce14eebef 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json @@ -19,6 +19,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -78,6 +84,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3sqsS3LoggingBucket0B0BC86A", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3sqsS3LoggingBucket0B0BC86A", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -119,6 +164,25 @@ } } }, + "tests3sqsS3LoggingBucketAutoDeleteObjectsCustomResource054A5A8A": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3sqsS3LoggingBucket0B0BC86A" + } + }, + "DependsOn": [ + "tests3sqsS3LoggingBucketPolicy3A15958C" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3sqsS3BucketFF76CDA6": { "Type": "AWS::S3::Bucket", "Properties": { @@ -512,6 +576,64 @@ ] } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3sqsS3LoggingBucket0B0BC86A" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts index 2bc475657..0892cf04f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts @@ -28,6 +28,7 @@ new S3ToSqs(stack, 'test-s3-sqs', { }, loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, bucketName: 'custom-logging-bucket', encryption: BucketEncryption.S3_MANAGED, versioned: true diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingLoggingBucket.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingLoggingBucket.expected.json index 3e9c4bdc5..0e6edef9d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingLoggingBucket.expected.json @@ -53,6 +53,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -178,7 +179,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, @@ -318,6 +319,7 @@ }, { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingLoggingBucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingLoggingBucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingQueue.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingQueue.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingQueue.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingS3Bucket.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingS3Bucket.expected.json index c6b3e9b5b..0482b5ae2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingS3Bucket.expected.json @@ -53,6 +53,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -176,7 +177,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingS3Bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.existingS3Bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingS3Bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.noArguments.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json similarity index 88% rename from source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json index 39116fa34..4b67488a3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json @@ -19,6 +19,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -78,6 +84,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3stepfunctionsS3LoggingBucketF7586A92", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3stepfunctionsS3LoggingBucketF7586A92", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -119,6 +164,25 @@ } } }, + "tests3stepfunctionsS3LoggingBucketAutoDeleteObjectsCustomResource7F12902B": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3stepfunctionsS3LoggingBucketF7586A92" + } + }, + "DependsOn": [ + "tests3stepfunctionsS3LoggingBucketPolicyA69F8114" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3stepfunctionsS3Bucket2B08AD28": { "Type": "AWS::S3::Bucket", "Properties": { @@ -512,6 +576,64 @@ "Threshold": 1 } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3stepfunctionsS3LoggingBucketF7586A92" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ] + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts index ae11eb701..0bf98818c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts @@ -34,6 +34,7 @@ new S3ToStepfunctions(stack, 'test-s3-stepfunctions', { }, loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, bucketName: 'custom-logging-bucket', encryption: BucketEncryption.S3_MANAGED, versioned: true diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.expected.json index d6d2e344a..eea751b3e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.expected.json @@ -53,6 +53,7 @@ "Statement": [ { "Action": [ + "s3:PutBucketPolicy", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*" @@ -160,7 +161,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "5194f926380567b6fdffc61629afdad2afc818614cb227df45e499c69db163a7.zip" + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.pre-existing-bucket.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-s3-stepfunctions-no-argument.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json rename to source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-s3-stepfunctions-no-argument.expected.json index a0a1c4e60..08cf2043b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-s3-stepfunctions-no-argument.expected.json @@ -120,7 +120,7 @@ "Fn::Join": [ "", [ - "/aws/vendedlogs/states/constructs/s3-stepfunctions-no-argumenttest-s3-stepfunctions-construct-event-rule-step-function-constructStateMachineLog-", + "/aws/vendedlogs/states/constructs/s3stp-s3-stepfunctions-no-argumenttest-s3-stepfunctions-construct-event-rule-step-function-constructStateMachineLog-", { "Fn::Select": [ 2, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-s3-stepfunctions-no-argument.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3-stepfunctions-no-argument.ts rename to source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-s3-stepfunctions-no-argument.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.snslam-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.snslam-no-arguments.expected.json index 0eea518ec..7652a2031 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.snslam-no-arguments.expected.json @@ -139,7 +139,7 @@ } } }, - "testsnslambdaLambdaFunctionAllowInvokenoargumentstestsnslambdaSnsTopic42029AF3BAF184D6": { + "testsnslambdaLambdaFunctionAllowInvokesnslamnoargumentstestsnslambdaSnsTopicC2A3522489F066D4": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.snslam-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-sns-lambda/test/integ.snslam-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployFIFOQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployFIFOQueue.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployFIFOQueue.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployFIFOQueue.expected.json index 5f61faead..423b8ebd4 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployFIFOQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployFIFOQueue.expected.json @@ -33,6 +33,7 @@ "ImportedEncryptionKeyBE10B2FC": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -82,8 +83,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -91,6 +91,7 @@ "ImportedDLQEncryptionKeyDE178CD5": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -118,8 +119,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -323,18 +323,18 @@ ] } }, - "testsnssqsqueuedeployFIFOQueueTestTopicF4DE8F7CBB48A357": { + "testsnssqsqueuesnssqsdeployFIFOQueueTestTopicE42F11A6E8D5756E": { "Type": "AWS::SNS::Subscription", "Properties": { - "Protocol": "sqs", - "TopicArn": { - "Ref": "TestTopic339EC197" - }, "Endpoint": { "Fn::GetAtt": [ "testsnssqsqueueB02504BF", "Arn" ] + }, + "Protocol": "sqs", + "TopicArn": { + "Ref": "TestTopic339EC197" } }, "DependsOn": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployFIFOQueue.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployFIFOQueue.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployFIFOQueue.ts rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployFIFOQueue.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployStandardQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployStandardQueue.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployStandardQueue.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployStandardQueue.expected.json index cb3600029..643fa8183 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployStandardQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployStandardQueue.expected.json @@ -32,6 +32,7 @@ "ImportedEncryptionKeyBE10B2FC": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -81,8 +82,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -90,6 +90,7 @@ "ImportedDLQEncryptionKeyDE178CD5": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -117,8 +118,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -320,18 +320,18 @@ ] } }, - "testsnssqsqueuedeployStandardQueueTestTopic883C28A0E3343345": { + "testsnssqsqueuesnssqsdeployStandardQueueTestTopic5DF390FB363A1845": { "Type": "AWS::SNS::Subscription", "Properties": { - "Protocol": "sqs", - "TopicArn": { - "Ref": "TestTopic339EC197" - }, "Endpoint": { "Fn::GetAtt": [ "testsnssqsqueueB02504BF", "Arn" ] + }, + "Protocol": "sqs", + "TopicArn": { + "Ref": "TestTopic339EC197" } }, "DependsOn": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployStandardQueue.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployStandardQueue.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.deployStandardQueue.ts rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-deployStandardQueue.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.existing-kms-key.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-existing-kms-key.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.existing-kms-key.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-existing-kms-key.expected.json index f8b9ea9e9..7c1a3e846 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.existing-kms-key.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-existing-kms-key.expected.json @@ -4,6 +4,7 @@ "ImportedEncryptionKeyBE10B2FC": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -53,8 +54,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -346,18 +346,18 @@ ] } }, - "testsnssqsqueueexistingkmskeytestsnssqsSnsTopic7983450BF2F0AE01": { + "testsnssqsqueuesnssqsexistingkmskeytestsnssqsSnsTopic38F01D270E0130B8": { "Type": "AWS::SNS::Subscription", "Properties": { - "Protocol": "sqs", - "TopicArn": { - "Ref": "testsnssqsSnsTopic2CD0065B" - }, "Endpoint": { "Fn::GetAtt": [ "testsnssqsqueueB02504BF", "Arn" ] + }, + "Protocol": "sqs", + "TopicArn": { + "Ref": "testsnssqsSnsTopic2CD0065B" } }, "DependsOn": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.existing-kms-key.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-existing-kms-key.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.existing-kms-key.ts rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-existing-kms-key.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-no-arguments.expected.json index 718d86b59..0a8e04925 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-no-arguments.expected.json @@ -288,18 +288,18 @@ ] } }, - "testsnssqsstackqueuenoargumentstestsnssqsstackSnsTopic712B4DD27CD7036F": { + "testsnssqsstackqueuesnssqsnoargumentstestsnssqsstackSnsTopic716318502B9FD0D3": { "Type": "AWS::SNS::Subscription", "Properties": { - "Protocol": "sqs", - "TopicArn": { - "Ref": "testsnssqsstackSnsTopic92693DD8" - }, "Endpoint": { "Fn::GetAtt": [ "testsnssqsstackqueue908D8D48", "Arn" ] + }, + "Protocol": "sqs", + "TopicArn": { + "Ref": "testsnssqsstackSnsTopic92693DD8" } }, "DependsOn": [ @@ -309,6 +309,7 @@ "EncryptionKey1B843E66": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -384,8 +385,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.rawMessageDelivery.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-rawMessageDelivery.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.rawMessageDelivery.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-rawMessageDelivery.expected.json index 4f678f840..3bbb2200a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.rawMessageDelivery.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-rawMessageDelivery.expected.json @@ -4,6 +4,7 @@ "ImportedSQSEncryptionKey29533C9A": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -31,8 +32,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -372,13 +372,9 @@ ] } }, - "testsnssqsstackqueuerawMessageDeliverytestsnssqsstackSnsTopic1904512BF06EA9C9": { + "testsnssqsstackqueuesnssqsrawMessageDeliverytestsnssqsstackSnsTopic3172B66321A5F373": { "Type": "AWS::SNS::Subscription", "Properties": { - "Protocol": "sqs", - "TopicArn": { - "Ref": "testsnssqsstackSnsTopic92693DD8" - }, "Endpoint": { "Fn::GetAtt": [ "testsnssqsstackqueue908D8D48", @@ -423,6 +419,7 @@ } ] }, + "Protocol": "sqs", "RawMessageDelivery": true, "RedrivePolicy": { "deadLetterTargetArn": { @@ -431,6 +428,9 @@ "Arn" ] } + }, + "TopicArn": { + "Ref": "testsnssqsstackSnsTopic92693DD8" } }, "DependsOn": [ @@ -440,6 +440,7 @@ "EncryptionKey1B843E66": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -515,8 +516,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.rawMessageDelivery.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-rawMessageDelivery.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.rawMessageDelivery.ts rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-rawMessageDelivery.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-existing-kms-key.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-existing-kms-key.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-existing-kms-key.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-existing-kms-key.expected.json index f76afdd87..b5d9ea36d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-existing-kms-key.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-existing-kms-key.expected.json @@ -4,6 +4,7 @@ "ImportedSNSEncryptionKeyF83F9D6C": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -31,8 +32,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -40,6 +40,7 @@ "ImportedSQSEncryptionKey29533C9A": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -89,8 +90,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -382,18 +382,18 @@ ] } }, - "testsnssqsqueuesnsexistingkmskeytestsnssqsSnsTopic7F8632A2DD832F81": { + "testsnssqsqueuesnssqssnsexistingkmskeytestsnssqsSnsTopic30156F8ACF5CBBE3": { "Type": "AWS::SNS::Subscription", "Properties": { - "Protocol": "sqs", - "TopicArn": { - "Ref": "testsnssqsSnsTopic2CD0065B" - }, "Endpoint": { "Fn::GetAtt": [ "testsnssqsqueueB02504BF", "Arn" ] + }, + "Protocol": "sqs", + "TopicArn": { + "Ref": "testsnssqsSnsTopic2CD0065B" } }, "DependsOn": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-existing-kms-key.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-existing-kms-key.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-existing-kms-key.ts rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-existing-kms-key.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-managed-kms-key.expected.json b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-managed-kms-key.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-managed-kms-key.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-managed-kms-key.expected.json index be698b623..13e8bf6ee 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-managed-kms-key.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-managed-kms-key.expected.json @@ -4,6 +4,7 @@ "ImportedSQSEncryptionKey29533C9A": { "Type": "AWS::KMS::Key", "Properties": { + "EnableKeyRotation": true, "KeyPolicy": { "Statement": [ { @@ -53,8 +54,7 @@ } ], "Version": "2012-10-17" - }, - "EnableKeyRotation": true + } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" @@ -360,18 +360,18 @@ ] } }, - "testsnssqsqueuesnsmanagedkmskeytestsnssqsSnsTopicEE80A3561046D187": { + "testsnssqsqueuesnssqssnsmanagedkmskeytestsnssqsSnsTopicA513C5806E61C6C0": { "Type": "AWS::SNS::Subscription", "Properties": { - "Protocol": "sqs", - "TopicArn": { - "Ref": "testsnssqsSnsTopic2CD0065B" - }, "Endpoint": { "Fn::GetAtt": [ "testsnssqsqueueB02504BF", "Arn" ] + }, + "Protocol": "sqs", + "TopicArn": { + "Ref": "testsnssqsSnsTopic2CD0065B" } }, "DependsOn": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-managed-kms-key.ts b/source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-managed-kms-key.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.sns-managed-kms-key.ts rename to source/patterns/@aws-solutions-constructs/aws-sns-sqs/test/integ.snssqs-sns-managed-kms-key.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFifoQueue.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFifoQueue.expected.json index ffc3c0676..4202acbee 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFifoQueue.expected.json @@ -155,7 +155,7 @@ } } }, - "testsqslambdafifoLambdaFunctionSqsEventSourcedeployFifoQueuetestsqslambdafifoqueue90CAB7D6AF891A0A": { + "testsqslambdafifoLambdaFunctionSqsEventSourcesqslamdeployFifoQueuetestsqslambdafifoqueue471FB9167780560F": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "EventSourceArn": { diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFifoQueue.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFifoQueue.ts rename to source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFifoQueue.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFunction.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFunction.expected.json index dcc3a8016..043178078 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFunction.expected.json @@ -155,7 +155,7 @@ } } }, - "testsqslambdaLambdaFunctionSqsEventSourcedeployFunctiontestsqslambdaqueueC37BE757C660F26A": { + "testsqslambdaLambdaFunctionSqsEventSourcesqslamdeployFunctiontestsqslambdaqueueAA417393CB51C9D9": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "EventSourceArn": { diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.deployFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-deployFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-existingFunction.expected.json similarity index 99% rename from source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json rename to source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-existingFunction.expected.json index 8f53e1154..126189fd0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-existingFunction.expected.json @@ -155,7 +155,7 @@ } } }, - "LambdaFunctionSqsEventSourceexistingFunctiontestsqslambdaqueue15248716FB07DA49": { + "LambdaFunctionSqsEventSourcesqslamexistingFunctiontestsqslambdaqueue1655244776FD943D": { "Type": "AWS::Lambda::EventSourceMapping", "Properties": { "EventSourceArn": { diff --git a/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.ts b/source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-existingFunction.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.existingFunction.ts rename to source/patterns/@aws-solutions-constructs/aws-sqs-lambda/test/integ.sqslam-existingFunction.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.wafalb-no-arguments.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.wafalb-no-arguments.expected.json index 575dddfb3..8e5a20751 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.wafalb-no-arguments.expected.json @@ -10,7 +10,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc" + "Value": "wafalb-no-arguments/Vpc" } ] } @@ -32,7 +32,7 @@ }, { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet1" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet1" } ], "VpcId": { @@ -56,7 +56,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet1" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet1" } ], "VpcId": { @@ -97,7 +97,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet1" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet1" } ] } @@ -117,7 +117,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet1" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet1" } ] }, @@ -143,7 +143,7 @@ }, { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet2" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet2" } ], "VpcId": { @@ -167,7 +167,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet2" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet2" } ], "VpcId": { @@ -208,7 +208,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet2" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet2" } ] } @@ -228,7 +228,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet2" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet2" } ] }, @@ -254,7 +254,7 @@ }, { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet3" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet3" } ], "VpcId": { @@ -278,7 +278,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet3" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet3" } ], "VpcId": { @@ -319,7 +319,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet3" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet3" } ] } @@ -339,7 +339,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PublicSubnet3" + "Value": "wafalb-no-arguments/Vpc/PublicSubnet3" } ] }, @@ -365,7 +365,7 @@ }, { "Key": "Name", - "Value": "no-arguments/Vpc/PrivateSubnet1" + "Value": "wafalb-no-arguments/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -379,7 +379,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PrivateSubnet1" + "Value": "wafalb-no-arguments/Vpc/PrivateSubnet1" } ], "VpcId": { @@ -427,7 +427,7 @@ }, { "Key": "Name", - "Value": "no-arguments/Vpc/PrivateSubnet2" + "Value": "wafalb-no-arguments/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -441,7 +441,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PrivateSubnet2" + "Value": "wafalb-no-arguments/Vpc/PrivateSubnet2" } ], "VpcId": { @@ -489,7 +489,7 @@ }, { "Key": "Name", - "Value": "no-arguments/Vpc/PrivateSubnet3" + "Value": "wafalb-no-arguments/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -503,7 +503,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/PrivateSubnet3" + "Value": "wafalb-no-arguments/Vpc/PrivateSubnet3" } ], "VpcId": { @@ -540,7 +540,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc" + "Value": "wafalb-no-arguments/Vpc" } ] } @@ -574,7 +574,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/FlowLog" + "Value": "wafalb-no-arguments/Vpc/FlowLog" } ] } @@ -626,7 +626,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/FlowLog" + "Value": "wafalb-no-arguments/Vpc/FlowLog" } ] }, @@ -663,7 +663,7 @@ "Tags": [ { "Key": "Name", - "Value": "no-arguments/Vpc/FlowLog" + "Value": "wafalb-no-arguments/Vpc/FlowLog" } ], "TrafficType": "ALL" @@ -714,7 +714,7 @@ "newlbSecurityGroup04195C74": { "Type": "AWS::EC2::SecurityGroup", "Properties": { - "GroupDescription": "Automatically created Security Group for ELB noargumentsnewlb0B076C69", + "GroupDescription": "Automatically created Security Group for ELB wafalbnoargumentsnewlbD99D4109", "SecurityGroupEgress": [ { "CidrIp": "255.255.255.255/32", diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.wafalb-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-alb/test/integ.wafalb-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-existing-waf-to-multiple-gateways.expected.json similarity index 97% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-existing-waf-to-multiple-gateways.expected.json index f2926a264..0d1fc45b9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-existing-waf-to-multiple-gateways.expected.json @@ -194,7 +194,7 @@ } } }, - "testOneApiproxyANYApiPermissionexistingwaftomultiplegatewaystestOneApi22528807ANYproxy9ED2695E": { + "testOneApiproxyANYApiPermissionwafapiexistingwaftomultiplegatewaystestOneApiB9044B59ANYproxy1B0A478E": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -235,7 +235,7 @@ } } }, - "testOneApiproxyANYApiPermissionTestexistingwaftomultiplegatewaystestOneApi22528807ANYproxy55EEE701": { + "testOneApiproxyANYApiPermissionTestwafapiexistingwaftomultiplegatewaystestOneApiB9044B59ANYproxy0DF6631B": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -322,7 +322,7 @@ } } }, - "testOneApiANYApiPermissionexistingwaftomultiplegatewaystestOneApi22528807ANY278A4AFF": { + "testOneApiANYApiPermissionwafapiexistingwaftomultiplegatewaystestOneApiB9044B59ANYDB292C51": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -363,7 +363,7 @@ } } }, - "testOneApiANYApiPermissionTestexistingwaftomultiplegatewaystestOneApi22528807ANYBB10DF1E": { + "testOneApiANYApiPermissionTestwafapiexistingwaftomultiplegatewaystestOneApiB9044B59ANY2BFAB738": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -647,7 +647,7 @@ } } }, - "testTwoApiproxyANYApiPermissionexistingwaftomultiplegatewaystestTwoApiB96C8AF0ANYproxy40A72786": { + "testTwoApiproxyANYApiPermissionwafapiexistingwaftomultiplegatewaystestTwoApi3F5A8986ANYproxy1DFBDD22": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -688,7 +688,7 @@ } } }, - "testTwoApiproxyANYApiPermissionTestexistingwaftomultiplegatewaystestTwoApiB96C8AF0ANYproxyC55E58D0": { + "testTwoApiproxyANYApiPermissionTestwafapiexistingwaftomultiplegatewaystestTwoApi3F5A8986ANYproxy0FCB1905": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -775,7 +775,7 @@ } } }, - "testTwoApiANYApiPermissionexistingwaftomultiplegatewaystestTwoApiB96C8AF0ANYD7D25755": { + "testTwoApiANYApiPermissionwafapiexistingwaftomultiplegatewaystestTwoApi3F5A8986ANY258342E0": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -816,7 +816,7 @@ } } }, - "testTwoApiANYApiPermissionTestexistingwaftomultiplegatewaystestTwoApiB96C8AF0ANY2726789F": { + "testTwoApiANYApiPermissionTestwafapiexistingwaftomultiplegatewaystestTwoApi3F5A8986ANY6B2BB285": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-existing-waf-to-multiple-gateways.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.ts rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-existing-waf-to-multiple-gateways.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-no-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-no-arguments.expected.json index 7828ece80..9d9a39774 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-no-arguments.expected.json @@ -194,7 +194,7 @@ } } }, - "testApiproxyANYApiPermissionnoargumentstestApiE7931390ANYproxy64013C99": { + "testApiproxyANYApiPermissionwafapinoargumentstestApi4B407520ANYproxy10A0B1BE": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -235,7 +235,7 @@ } } }, - "testApiproxyANYApiPermissionTestnoargumentstestApiE7931390ANYproxyB62320D7": { + "testApiproxyANYApiPermissionTestwafapinoargumentstestApi4B407520ANYproxyE3EA6B08": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -322,7 +322,7 @@ } } }, - "testApiANYApiPermissionnoargumentstestApiE7931390ANYC253B3F4": { + "testApiANYApiPermissionwafapinoargumentstestApi4B407520ANY9475DCE2": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -363,7 +363,7 @@ } } }, - "testApiANYApiPermissionTestnoargumentstestApiE7931390ANYB623D7E8": { + "testApiANYApiPermissionTestwafapinoargumentstestApi4B407520ANYA4D7C2D5": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-partial-arguments.expected.json similarity index 98% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-partial-arguments.expected.json index 2bb675390..87d37dc69 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-partial-arguments.expected.json @@ -194,7 +194,7 @@ } } }, - "testApiproxyANYApiPermissionpartialargumentstestApi67E53489ANYproxyD442645B": { + "testApiproxyANYApiPermissionwafapipartialargumentstestApi4A48F3FBANYproxyAE6A25BF": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -235,7 +235,7 @@ } } }, - "testApiproxyANYApiPermissionTestpartialargumentstestApi67E53489ANYproxyA0A33584": { + "testApiproxyANYApiPermissionTestwafapipartialargumentstestApi4A48F3FBANYproxy2829A2A7": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -322,7 +322,7 @@ } } }, - "testApiANYApiPermissionpartialargumentstestApi67E53489ANY0CE0FBBB": { + "testApiANYApiPermissionwafapipartialargumentstestApi4A48F3FBANY92439CB8": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -363,7 +363,7 @@ } } }, - "testApiANYApiPermissionTestpartialargumentstestApi67E53489ANYFA990832": { + "testApiANYApiPermissionTestwafapipartialargumentstestApi4A48F3FBANY15778CF5": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-partial-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.partial-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-partial-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.wafaps-no-arguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.wafaps-no-arguments.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.wafaps-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.wafaps-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.wafaps-partial-arguments.expected.json similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.wafaps-partial-arguments.expected.json diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.wafaps-partial-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.partial-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-appsync/test/integ.wafaps-partial-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.existing-waf-to-multiple-cloudfront.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-existing-waf-to-multiple-cloudfront.expected.json similarity index 89% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.existing-waf-to-multiple-cloudfront.expected.json rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-existing-waf-to-multiple-cloudfront.expected.json index 1dd044136..f14be6611 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.existing-waf-to-multiple-cloudfront.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-existing-waf-to-multiple-cloudfront.expected.json @@ -7,7 +7,7 @@ "DefaultCacheBehavior": { "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "TargetOriginId": "existingwaftomultiplecloudfrontdistroOneOriginGroup16F812E2D", + "TargetOriginId": "wafcftexistingwaftomultiplecloudfrontdistroOneOriginGroup16D711F19", "ViewerProtocolPolicy": "allow-all" }, "Enabled": true, @@ -24,14 +24,14 @@ "Quantity": 1 } }, - "Id": "existingwaftomultiplecloudfrontdistroOneOriginGroup16F812E2D", + "Id": "wafcftexistingwaftomultiplecloudfrontdistroOneOriginGroup16D711F19", "Members": { "Items": [ { - "OriginId": "existingwaftomultiplecloudfrontdistroOneOrigin1720378E5" + "OriginId": "wafcftexistingwaftomultiplecloudfrontdistroOneOrigin17FBA6436" }, { - "OriginId": "existingwaftomultiplecloudfrontdistroOneOrigin274CE21CE" + "OriginId": "wafcftexistingwaftomultiplecloudfrontdistroOneOrigin23A024C57" } ], "Quantity": 2 @@ -49,7 +49,7 @@ ] }, "DomainName": "www.example.com", - "Id": "existingwaftomultiplecloudfrontdistroOneOrigin1720378E5" + "Id": "wafcftexistingwaftomultiplecloudfrontdistroOneOrigin17FBA6436" }, { "CustomOriginConfig": { @@ -59,7 +59,7 @@ ] }, "DomainName": "admin.example.com", - "Id": "existingwaftomultiplecloudfrontdistroOneOrigin274CE21CE" + "Id": "wafcftexistingwaftomultiplecloudfrontdistroOneOrigin23A024C57" } ], "WebACLId": { @@ -92,7 +92,7 @@ "DefaultCacheBehavior": { "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "TargetOriginId": "existingwaftomultiplecloudfrontdistroTwoOriginGroup1DD80530C", + "TargetOriginId": "wafcftexistingwaftomultiplecloudfrontdistroTwoOriginGroup1786AF0DE", "ViewerProtocolPolicy": "allow-all" }, "Enabled": true, @@ -109,14 +109,14 @@ "Quantity": 1 } }, - "Id": "existingwaftomultiplecloudfrontdistroTwoOriginGroup1DD80530C", + "Id": "wafcftexistingwaftomultiplecloudfrontdistroTwoOriginGroup1786AF0DE", "Members": { "Items": [ { - "OriginId": "existingwaftomultiplecloudfrontdistroTwoOrigin1E5A746DE" + "OriginId": "wafcftexistingwaftomultiplecloudfrontdistroTwoOrigin17844DE3F" }, { - "OriginId": "existingwaftomultiplecloudfrontdistroTwoOrigin22FA0DC4A" + "OriginId": "wafcftexistingwaftomultiplecloudfrontdistroTwoOrigin210278EB5" } ], "Quantity": 2 @@ -134,7 +134,7 @@ ] }, "DomainName": "www.example.com", - "Id": "existingwaftomultiplecloudfrontdistroTwoOrigin1E5A746DE" + "Id": "wafcftexistingwaftomultiplecloudfrontdistroTwoOrigin17844DE3F" }, { "CustomOriginConfig": { @@ -144,7 +144,7 @@ ] }, "DomainName": "admin.example.com", - "Id": "existingwaftomultiplecloudfrontdistroTwoOrigin22FA0DC4A" + "Id": "wafcftexistingwaftomultiplecloudfrontdistroTwoOrigin210278EB5" } ], "WebACLId": { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.existing-waf-to-multiple-cloudfront.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-existing-waf-to-multiple-cloudfront.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.existing-waf-to-multiple-cloudfront.ts rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-existing-waf-to-multiple-cloudfront.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-no-arguments.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-no-arguments.expected.json index 65721a0dd..291afbbd9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-no-arguments.expected.json @@ -7,7 +7,7 @@ "DefaultCacheBehavior": { "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "TargetOriginId": "noargumentsdistroOriginGroup1DC74B51C", + "TargetOriginId": "wafcftnoargumentsdistroOriginGroup1D51155E2", "ViewerProtocolPolicy": "allow-all" }, "Enabled": true, @@ -24,14 +24,14 @@ "Quantity": 1 } }, - "Id": "noargumentsdistroOriginGroup1DC74B51C", + "Id": "wafcftnoargumentsdistroOriginGroup1D51155E2", "Members": { "Items": [ { - "OriginId": "noargumentsdistroOrigin1337DEB39" + "OriginId": "wafcftnoargumentsdistroOrigin13A0BEDF7" }, { - "OriginId": "noargumentsdistroOrigin207F6D139" + "OriginId": "wafcftnoargumentsdistroOrigin210710A25" } ], "Quantity": 2 @@ -49,7 +49,7 @@ ] }, "DomainName": "www.example.com", - "Id": "noargumentsdistroOrigin1337DEB39" + "Id": "wafcftnoargumentsdistroOrigin13A0BEDF7" }, { "CustomOriginConfig": { @@ -59,7 +59,7 @@ ] }, "DomainName": "admin.example.com", - "Id": "noargumentsdistroOrigin207F6D139" + "Id": "wafcftnoargumentsdistroOrigin210710A25" } ], "WebACLId": { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-no-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-no-arguments.ts diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-partial-arguments.expected.json similarity index 94% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-partial-arguments.expected.json index dce1c2672..4743639ba 100644 --- a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-partial-arguments.expected.json @@ -7,7 +7,7 @@ "DefaultCacheBehavior": { "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", "Compress": true, - "TargetOriginId": "partialargumentsdistroOriginGroup13A14546B", + "TargetOriginId": "wafcftpartialargumentsdistroOriginGroup12A48644F", "ViewerProtocolPolicy": "allow-all" }, "Enabled": true, @@ -24,14 +24,14 @@ "Quantity": 1 } }, - "Id": "partialargumentsdistroOriginGroup13A14546B", + "Id": "wafcftpartialargumentsdistroOriginGroup12A48644F", "Members": { "Items": [ { - "OriginId": "partialargumentsdistroOrigin1D2A7BC52" + "OriginId": "wafcftpartialargumentsdistroOrigin1C84D3821" }, { - "OriginId": "partialargumentsdistroOrigin2689E5A52" + "OriginId": "wafcftpartialargumentsdistroOrigin240311680" } ], "Quantity": 2 @@ -49,7 +49,7 @@ ] }, "DomainName": "www.example.com", - "Id": "partialargumentsdistroOrigin1D2A7BC52" + "Id": "wafcftpartialargumentsdistroOrigin1C84D3821" }, { "CustomOriginConfig": { @@ -59,7 +59,7 @@ ] }, "DomainName": "admin.example.com", - "Id": "partialargumentsdistroOrigin2689E5A52" + "Id": "wafcftpartialargumentsdistroOrigin240311680" } ], "WebACLId": { diff --git a/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-partial-arguments.ts similarity index 100% rename from source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.partial-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-wafwebacl-cloudfront/test/integ.wafcft-partial-arguments.ts From 50e9396777f768bd32cab4a796e33cad9adc09f9 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 12 Nov 2023 20:41:53 -0500 Subject: [PATCH 65/73] Update viperlightignore filenames --- .viperlightignore | 186 +++++++++++++++++++++++----------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/.viperlightignore b/.viperlightignore index d07f9c791..b7a66cc94 100644 --- a/.viperlightignore +++ b/.viperlightignore @@ -5,17 +5,17 @@ node_modules/ deployment/publishing/nuget/publish.sh:43 deployment/publishing/nuget/publish.sh:44 source/use_cases/aws-serverless-web-app/test/integ.backend-deployment.expected.json:180 -source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.deployFunction.expected.json:172 -source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.existingFunction.expected.json:172 -source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.no-arguments.expected.json:172 -source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apigateway-dynamodb-existing-table.expected.json:60 +source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-deployFunction.expected.json:172 +source/patterns/@aws-solutions-constructs/aws-apigateway-lambda/test/integ.apilam-existingFunction.expected.json:172 +source/patterns/@aws-solutions-constructs/aws-cloudfront-apigateway/test/integ.cftapi-no-arguments.expected.json:172 +source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/test/integ.apiddb-apigateway-dynamodb-existing-table.expected.json:60 CODE_OF_CONDUCT.md:4 CONTRIBUTING.md:244 source/patterns/@aws-solutions-constructs/core/test/step-function-helper.test.ts:107 source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/test.kinesisstream-gluejob.test.ts:126 -source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.deployFunction.expected.json:112 -source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.existingFunction.expected.json:112 -source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apigateway-sqs-crud.expected.json:201 +source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-deployFunction.expected.json:112 +source/patterns/@aws-solutions-constructs/aws-lambda-sqs/test/integ.lamsqs-existingFunction.expected.json:112 +source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.expected.json:201 source/tools/cdk-integ-tools/package-lock.json:373 source/patterns/@aws-solutions-constructs/core/test/step-function-helper.test.js:115 source/patterns/@aws-solutions-constructs/core/test/lambda-helper.test.ts:233 @@ -34,79 +34,79 @@ source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/eventbridge-s source/patterns/@aws-solutions-constructs/aws-dynamodb-stream-lambda/test/dynamodb-stream-lambda.test.ts:103 source/patterns/@aws-solutions-constructs/aws-dynamodbstreams-lambda/test/dynamodbstreams-lambda.test.ts:103 source/patterns/@aws-solutions-constructs/aws-apigateway-iot/README.md:39 -source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.defaultParams.expected.json:266 -source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.overrideParams.expected.json:269 +source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-defaultParams.expected.json:266 +source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-overrideParams.expected.json:269 source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/test.apigateway-iot.test.ts:29 -source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.override_auth_api_keys.expected.json:267 +source/patterns/@aws-solutions-constructs/aws-apigateway-iot/test/integ.apiiot-override_auth_api_keys.expected.json:267 source/patterns/@aws-solutions-constructs/core/test/cloudfront-distribution-s3-helper.test.ts:487 source/patterns/@aws-solutions-constructs/aws-cloudfront-s3/test/test.cloudfront-s3.test.ts:214 source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/test.s3-sqs.test.ts:251 source/use_cases/aws-custom-glue-etl/stream-producer/generate_data.py:86 source/use_cases/aws-custom-glue-etl/stream-producer/generate_data.py:87 source/patterns/@aws-solutions-constructs/aws-lambda-secretsmanager/test/lambda-secretsmanager.test.ts:460 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:6 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:9 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:12 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:15 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:18 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:21 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:24 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:27 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:30 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:33 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:36 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:39 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:42 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:45 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:48 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:51 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:54 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:57 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:60 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:63 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.deployFunction.expected.json:66 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:500 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:503 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:506 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:509 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:512 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:515 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:518 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:521 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:524 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:527 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:530 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:533 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:536 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:539 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:542 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:545 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:548 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:551 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:554 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:557 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingFunction.expected.json:560 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:6 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:9 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:12 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:15 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:18 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:21 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:24 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:27 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:30 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:33 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:36 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:39 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:42 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:45 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:48 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:51 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:54 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:57 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:60 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:63 -source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.existingSageMakerEndpoint.expected.json:66 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:6 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:9 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:12 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:15 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:18 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:21 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:24 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:27 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:30 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:33 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:36 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:39 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:42 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:45 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:48 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:51 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:54 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:57 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:60 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:63 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-deployFunction.expected.json:66 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:500 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:503 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:506 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:509 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:512 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:515 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:518 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:521 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:524 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:527 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:530 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:533 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:536 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:539 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:542 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:545 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:548 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:551 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:554 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:557 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingFunction.expected.json:560 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:6 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:9 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:12 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:15 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:18 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:21 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:24 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:27 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:30 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:33 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:36 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:39 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:42 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:45 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:48 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:51 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:54 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:57 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:60 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:63 +source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/integ.lamsag-existingSageMakerEndpoint.expected.json:66 source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/test-helper.ts:24 source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/test-helper.ts:27 source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/test-helper.ts:30 @@ -128,35 +128,35 @@ source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/test source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/test-helper.ts:78 source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/test-helper.ts:81 source/patterns/@aws-solutions-constructs/aws-lambda-sagemakerendpoint/test/test-helper.ts:84 -source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.existing-s3-bucket.expected.json:33 -source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafwebacl-apigateway-iot.expected.json:265 -source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.existing-waf-to-multiple-gateways.expected.json:814 +source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-existing-s3-bucket.expected.json:33 +source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-wafwebacl-apigateway-iot.expected.json:265 +source/patterns/@aws-solutions-constructs/aws-wafwebacl-apigateway/test/integ.wafapi-existing-waf-to-multiple-gateways.expected.json:814 # This is a test case source/patterns/@aws-solutions-constructs/aws-kinesisstreams-gluejob/test/test.kinesisstream-gluejob.test.ts:127 # aws-lambda-eventbridge. Auto generated Ids are ignored & x-ray resource permission with a `*` in test cases is ignored -source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunction.expected.json:122 -source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithNewEventBus.expected.json:149 -source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.deployFunctionWithVpc.expected.json:163 -source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingEventBus.expected.json:108 -source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.existingFunction.expected.json:122 +source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunction.expected.json:122 +source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.expected.json:149 +source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithVpc.expected.json:163 +source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.expected.json:108 +source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingFunction.expected.json:122 source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts:28 source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/aws-lambda-eventbridge.test.ts:339 source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md:35 source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts:27 source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts:680 # These are references to the us-east-1 ELBV2 account (publicly known) -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApi.expected.json:235 -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPrivateApiExistingZone.expected.json:904 -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json:233 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiNewResources.expected.json:238 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiNewResources.expected.json:244 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.twoTargets.expected.json:244 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.privateApiExistingResources.expected.json:1132 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.publicApiExistingResources.expected.json:1132 -source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json:1034 -source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-public-http.expected.json:1062 -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.deployPublicApiNewAlb.expected.json:237 -source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.all-new-two-targets.expected.json:1089 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApi.expected.json:235 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApiExistingZone.expected.json:904 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.expected.json:233 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiNewResources.expected.json:238 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiNewResources.expected.json:244 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-twoTargets.expected.json:244 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiExistingResources.expected.json:1132 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiExistingResources.expected.json:1132 +source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.expected.json:1034 +source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-public-http.expected.json:1062 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.expected.json:237 +source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.expected.json:1089 source/patterns/@aws-solutions-constructs/aws-alb-fargate/README.md:79 source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md:85 source/patterns/@aws-solutions-constructs/aws-route53-alb/README.md:60 From 6c447391ffc49a810adae57112b7e771df5c3ff4 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 12 Nov 2023 20:47:26 -0500 Subject: [PATCH 66/73] More viperlight lines --- .viperlightignore | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.viperlightignore b/.viperlightignore index b7a66cc94..26e54fef2 100644 --- a/.viperlightignore +++ b/.viperlightignore @@ -145,18 +145,18 @@ source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md:35 source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts:27 source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/alb-lambda.test.ts:680 # These are references to the us-east-1 ELBV2 account (publicly known) -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApi.expected.json:235 -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApiExistingZone.expected.json:904 -source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.expected.json:233 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiNewResources.expected.json:238 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiNewResources.expected.json:244 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-twoTargets.expected.json:244 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiExistingResources.expected.json:1132 -source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiExistingResources.expected.json:1132 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApi.expected.json:236 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPrivateApiExistingZone.expected.json:905 +source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.expected.json:234 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiNewResources.expected.json:239 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiNewResources.expected.json:245 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-twoTargets.expected.json:245 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-privateApiExistingResources.expected.json:1133 +source/patterns/@aws-solutions-constructs/aws-alb-lambda/test/integ.alblam-publicApiExistingResources.expected.json:1133 source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.expected.json:1034 -source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-public-http.expected.json:1062 +source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-public-http.expected.json:1063 source/patterns/@aws-solutions-constructs/aws-route53-alb/test/integ.r53alb-deployPublicApiNewAlb.expected.json:237 -source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.expected.json:1089 +source/patterns/@aws-solutions-constructs/aws-alb-fargate/test/integ.albfar-all-new-two-targets.expected.json:1090 source/patterns/@aws-solutions-constructs/aws-alb-fargate/README.md:79 source/patterns/@aws-solutions-constructs/aws-alb-lambda/README.md:85 source/patterns/@aws-solutions-constructs/aws-route53-alb/README.md:60 From 36bab135ae58878f650b07ded1e1d6171432d14f Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 12 Nov 2023 22:12:39 -0500 Subject: [PATCH 67/73] fix cfn-nag issues from Custom Resources --- ...evtfhss3-customLoggingBucket.expected.json | 20 ++++++++++++++++++- .../integ.evtfhss3-customLoggingBucket.ts | 3 ++- ...iotfhss3-customLoggingBucket.expected.json | 20 ++++++++++++++++++- .../integ.iotfhss3-customLoggingBucket.ts | 4 +++- ...-iot-s3-new-encrypted-bucket.expected.json | 20 ++++++++++++++++++- ...integ.iots3-iot-s3-new-encrypted-bucket.ts | 3 ++- ...eg.fhss3-customLoggingBucket.expected.json | 20 ++++++++++++++++++- .../test/integ.fhss3-customLoggingBucket.ts | 3 ++- .../integ.fhss3-no-arguments.expected.json | 20 ++++++++++++++++++- .../test/integ.fhss3-no-arguments.ts | 3 ++- .../integ.fhss3-two-instances.expected.json | 20 ++++++++++++++++++- .../test/integ.fhss3-two-instances.ts | 3 ++- ...kinfhss3-customLoggingBucket.expected.json | 20 ++++++++++++++++++- .../integ.kinfhss3-customLoggingBucket.ts | 3 ++- ...eg.lams3-customLoggingBucket.expected.json | 20 ++++++++++++++++++- .../test/integ.lams3-customLoggingBucket.ts | 3 ++- .../integ.s3lam-no-arguments.expected.json | 20 ++++++++++++++++++- .../test/integ.s3lam-no-arguments.ts | 1 + ...eg.s3sns-customLoggingBucket.expected.json | 20 ++++++++++++++++++- .../test/integ.s3sns-customLoggingBucket.ts | 3 ++- ...eg.s3sqs-customLoggingBucket.expected.json | 20 ++++++++++++++++++- .../test/integ.s3sqs-customLoggingBucket.ts | 3 ++- ...eg.s3stp-customLoggingBucket.expected.json | 20 ++++++++++++++++++- .../test/integ.s3stp-customLoggingBucket.ts | 3 ++- 24 files changed, 252 insertions(+), 23 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json index 5db0e63f4..9038d995c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json @@ -587,7 +587,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts index f4bf4df6e..d25f52a2f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts @@ -14,7 +14,7 @@ /// !cdk-integ * import { App, Stack, RemovalPolicy, Duration } from "aws-cdk-lib"; import { EventbridgeToKinesisFirehoseToS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; import * as s3 from "aws-cdk-lib/aws-s3"; import * as events from 'aws-cdk-lib/aws-events'; @@ -42,4 +42,5 @@ new EventbridgeToKinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { } }); +suppressAutoDeleteHandlerWarnings(stack); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json index ae4b54e2f..6be801e71 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json @@ -584,7 +584,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts index 6a797d62a..8d1d2754e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts @@ -15,7 +15,7 @@ import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { BucketEncryption } from "aws-cdk-lib/aws-s3"; import { IotToKinesisFirehoseToS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; const app = new App(); @@ -42,4 +42,6 @@ new IotToKinesisFirehoseToS3(stack, 'test-iot-kinesisfirehose-s3', { versioned: true } }); + +suppressAutoDeleteHandlerWarnings(stack); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.expected.json index 1bf94a133..6613131c2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.expected.json @@ -492,7 +492,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.ts index bc414640e..1147ee0ba 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-s3/test/integ.iots3-iot-s3-new-encrypted-bucket.ts @@ -15,7 +15,7 @@ import { App, RemovalPolicy, Stack } from "aws-cdk-lib"; import * as kms from 'aws-cdk-lib/aws-kms'; import { IotToS3, IotToS3Props } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; import { BucketEncryption } from "aws-cdk-lib/aws-s3"; const app = new App(); @@ -48,4 +48,5 @@ const props: IotToS3Props = { new IotToS3(stack, 'test-iot-s3-integration', props); +suppressAutoDeleteHandlerWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.expected.json index 435729705..bf9cb8c7f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.expected.json @@ -516,7 +516,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.ts index 3ba6412e4..1457e1ae7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-customLoggingBucket.ts @@ -15,7 +15,7 @@ import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { BucketEncryption } from "aws-cdk-lib/aws-s3"; import { KinesisFirehoseToS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; const app = new App(); @@ -34,4 +34,5 @@ new KinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { versioned: true } }); +suppressAutoDeleteHandlerWarnings(stack); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.expected.json index 49c71aa0e..fd1419390 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.expected.json @@ -580,7 +580,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.ts index 54f405907..835266eb9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-no-arguments.ts @@ -14,7 +14,7 @@ // Imports import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { KinesisFirehoseToS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; // Setup const app = new App(); @@ -32,5 +32,6 @@ new KinesisFirehoseToS3(stack, 'test-firehose-s3', { } }); +suppressAutoDeleteHandlerWarnings(stack); // Synth app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json index 8ca18c263..e417e124b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json @@ -516,7 +516,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } }, "secondconstructS3LoggingBucketBB57C475": { "Type": "AWS::S3::Bucket", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts index 78100868c..a2b99fefb 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts @@ -14,7 +14,7 @@ // Imports import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { KinesisFirehoseToS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; // Setup const app = new App(); @@ -42,5 +42,6 @@ new KinesisFirehoseToS3(stack, 'second-construct', { } }); +suppressAutoDeleteHandlerWarnings(stack); // Synth app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json index 0e5a01deb..483facbd8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json @@ -607,7 +607,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts index c92597c52..35468edf7 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts @@ -15,7 +15,7 @@ import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { BucketEncryption } from "aws-cdk-lib/aws-s3"; import { KinesisStreamsToKinesisFirehoseToS3 } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; const app = new App(); @@ -37,4 +37,5 @@ new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { removalPolicy: RemovalPolicy.DESTROY } }); +suppressAutoDeleteHandlerWarnings(stack); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.expected.json index 456eb1e61..d9ae239f6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.expected.json @@ -507,7 +507,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.ts index 2a4a7364c..55ea15e14 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-s3/test/integ.lams3-customLoggingBucket.ts @@ -16,7 +16,7 @@ import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { BucketEncryption } from "aws-cdk-lib/aws-s3"; import { LambdaToS3 } from "../lib"; import * as lambda from 'aws-cdk-lib/aws-lambda'; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; const app = new App(); @@ -40,4 +40,5 @@ new LambdaToS3(stack, 'test-lambda-s3', { versioned: true } }); +suppressAutoDeleteHandlerWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.expected.json index 14829492d..a21853fd2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.expected.json @@ -531,7 +531,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.ts index 3fcd7b43c..03e1aeeb3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-lambda/test/integ.s3lam-no-arguments.ts @@ -47,4 +47,5 @@ defaults.addCfnSuppressRules(s3Bucket, [ reason: 'This S3 bucket is created for unit/ integration testing purposes only.' }, ]); +defaults.suppressAutoDeleteHandlerWarnings(stack); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.expected.json index 6c646d326..fac652b13 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.expected.json @@ -522,7 +522,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.ts index e4191fcab..654f51366 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-customLoggingBucket.ts @@ -14,7 +14,7 @@ /// !cdk-integ * import { App, RemovalPolicy, Stack } from "aws-cdk-lib"; import { S3ToSns } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); @@ -29,4 +29,5 @@ new S3ToSns(stack, 'test-s3-sns', { } }); +suppressAutoDeleteHandlerWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json index ce14eebef..76a958692 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json @@ -632,7 +632,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts index 0892cf04f..df3b22c36 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts @@ -15,7 +15,7 @@ import {App, Stack, RemovalPolicy} from "aws-cdk-lib"; import { BucketEncryption } from "aws-cdk-lib/aws-s3"; import {S3ToSqs} from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; const app = new App(); @@ -34,4 +34,5 @@ new S3ToSqs(stack, 'test-s3-sqs', { versioned: true } }); +suppressAutoDeleteHandlerWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json index 4b67488a3..09e2dad25 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json @@ -632,7 +632,25 @@ }, "DependsOn": [ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" - ] + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "CDK generated custom resource" + }, + { + "id": "W89", + "reason": "CDK generated custom resource" + }, + { + "id": "W92", + "reason": "CDK generated custom resource" + } + ] + } + } }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts index 0bf98818c..c3f85b225 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts @@ -16,7 +16,7 @@ import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { BucketEncryption } from "aws-cdk-lib/aws-s3"; import { S3ToStepfunctions } from "../lib"; import * as stepfunctions from 'aws-cdk-lib/aws-stepfunctions'; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { generateIntegStackName, suppressAutoDeleteHandlerWarnings } from '@aws-solutions-constructs/core'; const app = new App(); @@ -45,4 +45,5 @@ new S3ToStepfunctions(stack, 'test-s3-stepfunctions', { } }); +suppressAutoDeleteHandlerWarnings(stack); app.synth(); From 55df93cd4abd5e27379a75b69b8dd3bdccb1727a Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 12 Nov 2023 22:26:10 -0500 Subject: [PATCH 68/73] Fix error --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d4be23dc..61d690527 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. See [standa ## [2.46.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.45.0...v2.46.0) (2023-11-09) +Built on CDK v2.105.0 +Renaming and refreshing of all integration test files ### Bug Fixes @@ -11,7 +13,7 @@ All notable changes to this project will be documented in this file. See [standa ## [2.45.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.44.0...v2.45.0) (2023-10-14) -Built on CDK v2.105.0 +Built on CDK v2.99.1 Significant internal clean up chores ### Bug Fixes From e2428a3d7e2cbad6ce630ba8d7163f0ac7dbe89e Mon Sep 17 00:00:00 2001 From: biffgaut Date: Sun, 12 Nov 2023 22:36:57 -0500 Subject: [PATCH 69/73] Typos --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61d690527..a9bf148ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,8 +20,6 @@ Significant internal clean up chores * **all:** typos ([#1010](https://github.com/awslabs/aws-solutions-constructs/issues/1010)) ([0787baf](https://github.com/awslabs/aws-solutions-constructs/commit/0787baf7c68f84599139e5b886d5942b076174f2)) -* **aws-eventbridge-sns:** long sns topic names break eventbridge bindings ([#1024](https://github.com/awslabs/aws-solutions-constructs/issues/1024)) - ## [2.44.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.43.0...v2.44.0) (2023-08-29) Built on CDK v2.82.0 (no new features, just internal housekeeping) From c350b81218301bb76b0e8018490517a96812feaa Mon Sep 17 00:00:00 2001 From: biffgaut <78155736+biffgaut@users.noreply.github.com> Date: Mon, 20 Nov 2023 09:47:46 -0500 Subject: [PATCH 70/73] chore(all): integration test cleanup (#1027) * Add autoDelete, fix name conflicts in integ tests * Lock JSII version to avoid Docker container issue * Suppress cfn-nag messages for CDK Custom Resource * Refresh tests with cfn-nag stuff * delete objects from log buckets --- source/package.json | 4 +- ...evtfhss3-customLoggingBucket.expected.json | 154 ++-- .../integ.evtfhss3-customLoggingBucket.ts | 5 +- ...esisfirehose-s3-new-eventbus.expected.json | 405 ---------- ....evtfhss3-existing-eventbus.expected.json} | 206 ++++- ...ts => integ.evtfhss3-existing-eventbus.ts} | 8 +- ...tfhss3-existingLoggingBucket.expected.json | 62 +- .../integ.evtfhss3-existingLoggingBucket.ts | 4 +- ...integ.evtfhss3-new-eventbus.expected.json} | 302 ++++---- ...tbus.ts => integ.evtfhss3-new-eventbus.ts} | 10 +- .../integ.evtfhss3-no-arguments.expected.json | 709 ++++++++++++++++++ ...ents.ts => integ.evtfhss3-no-arguments.ts} | 14 +- ...sisstreams-existing-eventbus.expected.json | 2 +- ...bridge-kinesisstreams-existing-eventbus.ts | 2 +- ...-kinesisstreams-new-eventbus.expected.json | 6 +- ...eventbridge-kinesisstreams-new-eventbus.ts | 2 +- .../test/integ.evtsns-exist-bus.expected.json | 2 +- .../test/integ.evtsns-exist-bus.ts | 2 +- .../test/integ.evtsns-new-bus.expected.json | 6 +- .../test/integ.evtsns-new-bus.ts | 2 +- .../test/integ.evtsqs-exist-bus.expected.json | 2 +- .../test/integ.evtsqs-exist-bus.ts | 2 +- .../test/integ.evtsqs-new-bus.expected.json | 6 +- .../test/integ.evtsqs-new-bus.ts | 2 +- ...pfunctions-existing-eventbus.expected.json | 22 +- ...tbridge-stepfunctions-existing-eventbus.ts | 1 - ...e-stepfunctions-new-eventbus.expected.json | 22 +- ...-eventbridge-stepfunctions-new-eventbus.ts | 1 - ...ge-stepfunctions-with-lambda.expected.json | 22 +- ...p-eventbridge-stepfunctions-with-lambda.ts | 1 - ...eg.farevt-existing-resources.expected.json | 2 +- .../test/integ.farevt-existing-resources.ts | 2 +- .../integ.fars3-new-resources.expected.json | 66 +- .../test/integ.fars3-new-resources.ts | 4 + ....farstp-no-cloudwatch-alarms.expected.json | 22 +- .../test/integ.farstp-no-cloudwatch-alarms.ts | 1 - ...iotfhss3-customLoggingBucket.expected.json | 2 +- .../integ.iotfhss3-customLoggingBucket.ts | 2 +- .../integ.iotfhss3-no-arguments.expected.json | 204 +++++ .../test/integ.iotfhss3-no-arguments.ts | 10 +- ...teg.iotfhss3-noLoggingBucket.expected.json | 140 ++++ .../test/integ.iotfhss3-noLoggingBucket.ts | 2 + .../integ.fhss3-two-instances.expected.json | 64 ++ .../test/integ.fhss3-two-instances.ts | 1 + ...kinfhss3-customLoggingBucket.expected.json | 1 - .../integ.kinfhss3-customLoggingBucket.ts | 1 - ...eployFunctionWithNewEventBus.expected.json | 8 +- ...eg.lamevt-deployFunctionWithNewEventBus.ts | 2 +- ...nteg.lamevt-existingEventBus.expected.json | 2 +- .../test/integ.lamevt-existingEventBus.ts | 2 +- ...lamstp-deployFunctionWithVpc.expected.json | 22 +- .../integ.lamstp-deployFunctionWithVpc.ts | 1 - ...teg.lamstp-existing-function.expected.json | 22 +- .../test/integ.lamstp-existing-function.ts | 1 - ...integ.s3sns-existingSnsTopic.expected.json | 216 ++++++ .../test/integ.s3sns-existingSnsTopic.ts | 8 +- ...-existingUnencryptedSnsTopic.expected.json | 216 ++++++ ...integ.s3sns-existingUnencryptedSnsTopic.ts | 10 +- ...nteg.s3sns-newTopicFromProps.expected.json | 216 ++++++ .../test/integ.s3sns-newTopicFromProps.ts | 8 +- .../integ.s3sns-noArguments.expected.json | 216 ++++++ .../test/integ.s3sns-noArguments.ts | 10 +- ...s3sns-s3EventTypesAndFilters.expected.json | 216 ++++++ .../integ.s3sns-s3EventTypesAndFilters.ts | 8 +- ...ns-snsTopicWithAwsManagedKey.expected.json | 216 ++++++ .../integ.s3sns-snsTopicWithAwsManagedKey.ts | 8 +- ...integ.s3sqs-creatingNewQueue.expected.json | 152 ++++ .../test/integ.s3sqs-creatingNewQueue.ts | 2 + ...eg.s3sqs-customLoggingBucket.expected.json | 1 - .../test/integ.s3sqs-customLoggingBucket.ts | 1 - .../integ.s3sqs-existingQueue.expected.json | 152 ++++ .../test/integ.s3sqs-existingQueue.ts | 2 + .../integ.s3sqs-noArguments.expected.json | 216 ++++++ .../test/integ.s3sqs-noArguments.ts | 10 +- ...eg.s3stp-customLoggingBucket.expected.json | 87 ++- .../test/integ.s3stp-customLoggingBucket.ts | 3 +- ...eg.s3stp-pre-existing-bucket.expected.json | 22 +- .../test/integ.s3stp-pre-existing-bucket.ts | 1 - 78 files changed, 3843 insertions(+), 726 deletions(-) delete mode 100644 source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.expected.json rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json => integ.evtfhss3-existing-eventbus.expected.json} (57%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.ts => integ.evtfhss3-existing-eventbus.ts} (82%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.expected.json => integ.evtfhss3-new-eventbus.expected.json} (62%) rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.ts => integ.evtfhss3-new-eventbus.ts} (83%) create mode 100644 source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-no-arguments.expected.json rename source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/{integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.ts => integ.evtfhss3-no-arguments.ts} (73%) diff --git a/source/package.json b/source/package.json index 461c7bb91..d540cc49c 100644 --- a/source/package.json +++ b/source/package.json @@ -23,8 +23,8 @@ "eslint-plugin-license-header": "^0.2.0", "fs-extra": "^8.1.0", "jest": "^27.4.0", - "jsii": "^1.49.0", - "jsii-pacmak": "^1.49.0", + "jsii": "1.91.0", + "jsii-pacmak": "1.91.0", "tslint": "^5.20.1", "typescript": "4.7.4", "aws-cdk-migration": "^1.135.0" diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json index 9038d995c..55a5c20f8 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.expected.json @@ -1,6 +1,6 @@ { "Resources": { - "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C": { + "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -12,7 +12,7 @@ } ] }, - "BucketName": "custom-logging-bucket", + "BucketName": "evtfhss3-customloggingbucket-custom-logging-bucket", "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -42,11 +42,11 @@ } } }, - "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketPolicyCF0D71BD": { + "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketPolicy4452CB71": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF" }, "PolicyDocument": { "Statement": [ @@ -64,7 +64,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF", "Arn" ] }, @@ -74,7 +74,7 @@ [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF", "Arn" ] }, @@ -103,7 +103,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF", "Arn" ] }, @@ -113,7 +113,7 @@ [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF", "Arn" ] }, @@ -129,7 +129,7 @@ "ArnLike": { "aws:SourceArn": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91", "Arn" ] } @@ -150,7 +150,7 @@ [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C", + "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF", "Arn" ] }, @@ -164,7 +164,7 @@ } } }, - "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketAutoDeleteObjectsCustomResourceB808B0FC": { + "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAutoDeleteObjectsCustomResource555FE86B": { "Type": "Custom::S3AutoDeleteObjects", "Properties": { "ServiceToken": { @@ -174,16 +174,16 @@ ] }, "BucketName": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF" } }, "DependsOn": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketPolicyCF0D71BD" + "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketPolicy4452CB71" ], "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" }, - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF": { + "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -210,7 +210,7 @@ }, "LoggingConfiguration": { "DestinationBucketName": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF" } }, "PublicAccessBlockConfiguration": { @@ -219,6 +219,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -226,11 +232,11 @@ "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" }, - "testkinesisfirehoses3KinesisFirehoseToS3S3BucketPolicy46BDB29D": { + "evtfhss3customlogbucketKinesisFirehoseToS3S3BucketPolicyAD917756": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91" }, "PolicyDocument": { "Statement": [ @@ -248,7 +254,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91", "Arn" ] }, @@ -258,7 +264,46 @@ [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91", "Arn" ] }, @@ -273,7 +318,26 @@ } } }, - "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5": { + "evtfhss3customlogbucketKinesisFirehoseToS3S3BucketAutoDeleteObjectsCustomResource53718158": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91" + } + }, + "DependsOn": [ + "evtfhss3customlogbucketKinesisFirehoseToS3S3BucketPolicyAD917756" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "evtfhss3customlogbucketKinesisFirehoseToS3firehoseloggroupE047892B": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", @@ -292,17 +356,17 @@ } } }, - "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstreamEC0EA660": { + "evtfhss3customlogbucketKinesisFirehoseToS3firehoseloggroupfirehoselogstream1353170F": { "Type": "AWS::Logs::LogStream", "Properties": { "LogGroupName": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3firehoseloggroupE047892B" } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" }, - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRole18870C08": { + "evtfhss3customlogbucketKinesisFirehoseToS3KinesisFirehoseRoleAC109402": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -319,7 +383,7 @@ } } }, - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicyD6A1BC51": { + "evtfhss3customlogbucketKinesisFirehoseToS3KinesisFirehosePolicy56683A68": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -337,7 +401,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91", "Arn" ] }, @@ -347,7 +411,7 @@ [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91", "Arn" ] }, @@ -378,11 +442,11 @@ }, ":log-group:", { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3firehoseloggroupE047892B" }, ":log-stream:", { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstreamEC0EA660" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3firehoseloggroupfirehoselogstream1353170F" } ] ] @@ -391,25 +455,25 @@ ], "Version": "2012-10-17" }, - "PolicyName": "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicyD6A1BC51", + "PolicyName": "evtfhss3customlogbucketKinesisFirehoseToS3KinesisFirehosePolicy56683A68", "Roles": [ { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRole18870C08" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3KinesisFirehoseRoleAC109402" } ] } }, - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D": { + "evtfhss3customlogbucketKinesisFirehoseToS3KinesisFirehoseE058C963": { "Type": "AWS::KinesisFirehose::DeliveryStream", "Properties": { "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseevtfhss3customLogoses3KinesisFirehoseToS3E4F82781", + "DeliveryStreamName": "KinesisFirehoseevtfhss3customLogucketKinesisFirehoseToS340915E28", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3customlogbucketKinesisFirehoseToS3S3Bucket4B282A91", "Arn" ] }, @@ -420,10 +484,10 @@ "CloudWatchLoggingOptions": { "Enabled": true, "LogGroupName": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3firehoseloggroupE047892B" }, "LogStreamName": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstreamEC0EA660" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3firehoseloggroupfirehoselogstream1353170F" } }, "CompressionFormat": "GZIP", @@ -453,14 +517,14 @@ }, "RoleARN": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRole18870C08", + "evtfhss3customlogbucketKinesisFirehoseToS3KinesisFirehoseRoleAC109402", "Arn" ] } } } }, - "testkinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole0D8588E2": { + "evtfhss3customlogbucketEventsRuleInvokeKinesisFirehoseRole8084E579": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -478,7 +542,7 @@ "Description": "Events Rule To Kinesis Firehose Role" } }, - "testkinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicy88CA86C4": { + "evtfhss3customlogbucketEventsRuleInvokeKinesisFirehosePolicy0A1C994F": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -491,7 +555,7 @@ "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D", + "evtfhss3customlogbucketKinesisFirehoseToS3KinesisFirehoseE058C963", "Arn" ] } @@ -499,15 +563,15 @@ ], "Version": "2012-10-17" }, - "PolicyName": "testkinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicy88CA86C4", + "PolicyName": "evtfhss3customlogbucketEventsRuleInvokeKinesisFirehosePolicy0A1C994F", "Roles": [ { - "Ref": "testkinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole0D8588E2" + "Ref": "evtfhss3customlogbucketEventsRuleInvokeKinesisFirehoseRole8084E579" } ] } }, - "testkinesisfirehoses3EventsRule05D717D1": { + "evtfhss3customlogbucketEventsRuleA7736706": { "Type": "AWS::Events::Rule", "Properties": { "ScheduleExpression": "rate(5 minutes)", @@ -516,14 +580,14 @@ { "Arn": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D", + "evtfhss3customlogbucketKinesisFirehoseToS3KinesisFirehoseE058C963", "Arn" ] }, "Id": "Target0", "RoleArn": { "Fn::GetAtt": [ - "testkinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole0D8588E2", + "evtfhss3customlogbucketEventsRuleInvokeKinesisFirehoseRole8084E579", "Arn" ] } @@ -578,7 +642,7 @@ [ "Lambda function for auto-deleting objects in ", { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketCF5B8A5C" + "Ref": "evtfhss3customlogbucketKinesisFirehoseToS3S3LoggingBucketAA70EACF" }, " S3 bucket." ] diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts index d25f52a2f..39c552526 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-customLoggingBucket.ts @@ -23,17 +23,18 @@ const app = new App(); // Empty arguments const stack = new Stack(app, generateIntegStackName(__filename)); -new EventbridgeToKinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { +new EventbridgeToKinesisFirehoseToS3(stack, 'evtfhss3-custom-log-bucket', { eventRuleProps: { schedule: events.Schedule.rate(Duration.minutes(5)) }, bucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, }, loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true, - bucketName: 'custom-logging-bucket', + bucketName: `${generateIntegStackName(__filename).toLowerCase()}-custom-logging-bucket`, encryption: s3.BucketEncryption.S3_MANAGED, versioned: true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.expected.json deleted file mode 100644 index b2641aa1a..000000000 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.expected.json +++ /dev/null @@ -1,405 +0,0 @@ -{ - "Description": "Integration Test for aws-eventbridge-kinesisfirehose-s3", - "Resources": { - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } - ] - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W35", - "reason": "This S3 bucket is created for unit/ integration testing purposes only." - } - ] - } - } - }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketPolicy6ECA7017": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" - } - }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Resource": [ - { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - } - ], - "Version": "2012-10-17" - } - } - }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276": { - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", - "Metadata": { - "cfn_nag": { - "rules_to_suppress": [ - { - "id": "W86", - "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" - }, - { - "id": "W84", - "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" - } - ] - } - } - }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstream443A77D5": { - "Type": "AWS::Logs::LogStream", - "Properties": { - "LogGroupName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276" - } - }, - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain" - }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRoleBCE20D0B": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "firehose.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicy9DC1B594": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:AbortMultipartUpload", - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - "s3:ListBucketMultipartUploads", - "s3:PutObject" - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", - "Arn" - ] - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", - "Arn" - ] - }, - "/*" - ] - ] - } - ] - }, - { - "Action": "logs:PutLogEvents", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":logs:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":log-group:", - { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276" - }, - ":log-stream:", - { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstream443A77D5" - } - ] - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicy9DC1B594", - "Roles": [ - { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRoleBCE20D0B" - } - ] - } - }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseA91109C4": { - "Type": "AWS::KinesisFirehose::DeliveryStream", - "Properties": { - "DeliveryStreamEncryptionConfigurationInput": { - "KeyType": "AWS_OWNED_CMK" - }, - "DeliveryStreamName": "KinesisFirehoseevtfhss3eventbridoses3KinesisFirehoseToS3980BC114", - "ExtendedS3DestinationConfiguration": { - "BucketARN": { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", - "Arn" - ] - }, - "BufferingHints": { - "IntervalInSeconds": 300, - "SizeInMBs": 5 - }, - "CloudWatchLoggingOptions": { - "Enabled": true, - "LogGroupName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276" - }, - "LogStreamName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstream443A77D5" - } - }, - "CompressionFormat": "GZIP", - "EncryptionConfiguration": { - "KMSEncryptionConfig": { - "AWSKMSKeyARN": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":kms:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":alias/aws/s3" - ] - ] - } - } - }, - "RoleARN": { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRoleBCE20D0B", - "Arn" - ] - } - } - } - }, - "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole2BA50856": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "events.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - }, - "Description": "Events Rule To Kinesis Firehose Role" - } - }, - "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicyFD82B8D9": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "firehose:PutRecord", - "firehose:PutRecordBatch" - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseA91109C4", - "Arn" - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicyFD82B8D9", - "Roles": [ - { - "Ref": "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole2BA50856" - } - ] - } - }, - "testeventbridgekinesisfirehoses3testF99202BA": { - "Type": "AWS::Events::EventBus", - "Properties": { - "Name": "test" - } - }, - "testeventbridgekinesisfirehoses3EventsRule9641436B": { - "Type": "AWS::Events::Rule", - "Properties": { - "EventBusName": { - "Ref": "testeventbridgekinesisfirehoses3testF99202BA" - }, - "EventPattern": { - "source": [ - "solutionsconstructs" - ] - }, - "State": "ENABLED", - "Targets": [ - { - "Arn": { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseA91109C4", - "Arn" - ] - }, - "Id": "Target0", - "RoleArn": { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole2BA50856", - "Arn" - ] - } - } - ] - } - } - }, - "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." - } - ] - } - } -} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existing-eventbus.expected.json similarity index 57% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existing-eventbus.expected.json index 3c281d102..cd91bbde1 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existing-eventbus.expected.json @@ -1,13 +1,13 @@ { "Description": "Integration Test for aws-eventbridge-kinesisfirehose-s3", "Resources": { - "testexistingeventbusC6E4A2D0": { + "evtfhss3testexistingeventbus5123D540": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "evtfhss3test-existing-eventbus" } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845": { + "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -38,6 +38,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -55,11 +61,11 @@ } } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketPolicy6ECA7017": { + "evtfhss3existingbusKinesisFirehoseToS3S3BucketPolicyAE39B235": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845" + "Ref": "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D" }, "PolicyDocument": { "Statement": [ @@ -77,7 +83,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D", "Arn" ] }, @@ -87,7 +93,46 @@ [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D", "Arn" ] }, @@ -102,7 +147,26 @@ } } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276": { + "evtfhss3existingbusKinesisFirehoseToS3S3BucketAutoDeleteObjectsCustomResource770CF930": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D" + } + }, + "DependsOn": [ + "evtfhss3existingbusKinesisFirehoseToS3S3BucketPolicyAE39B235" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "evtfhss3existingbusKinesisFirehoseToS3firehoseloggroup796118EE": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", @@ -121,17 +185,17 @@ } } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstream443A77D5": { + "evtfhss3existingbusKinesisFirehoseToS3firehoseloggroupfirehoselogstream93EC9AD0": { "Type": "AWS::Logs::LogStream", "Properties": { "LogGroupName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276" + "Ref": "evtfhss3existingbusKinesisFirehoseToS3firehoseloggroup796118EE" } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRoleBCE20D0B": { + "evtfhss3existingbusKinesisFirehoseToS3KinesisFirehoseRole505D9C33": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -148,7 +212,7 @@ } } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicy9DC1B594": { + "evtfhss3existingbusKinesisFirehoseToS3KinesisFirehosePolicyFD6C4ECA": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -166,7 +230,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D", "Arn" ] }, @@ -176,7 +240,7 @@ [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D", "Arn" ] }, @@ -207,11 +271,11 @@ }, ":log-group:", { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276" + "Ref": "evtfhss3existingbusKinesisFirehoseToS3firehoseloggroup796118EE" }, ":log-stream:", { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstream443A77D5" + "Ref": "evtfhss3existingbusKinesisFirehoseToS3firehoseloggroupfirehoselogstream93EC9AD0" } ] ] @@ -220,25 +284,25 @@ ], "Version": "2012-10-17" }, - "PolicyName": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicy9DC1B594", + "PolicyName": "evtfhss3existingbusKinesisFirehoseToS3KinesisFirehosePolicyFD6C4ECA", "Roles": [ { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRoleBCE20D0B" + "Ref": "evtfhss3existingbusKinesisFirehoseToS3KinesisFirehoseRole505D9C33" } ] } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseA91109C4": { + "evtfhss3existingbusKinesisFirehoseToS3KinesisFirehoseA77AB0B2": { "Type": "AWS::KinesisFirehose::DeliveryStream", "Properties": { "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseevtfhss3eventbridoses3KinesisFirehoseToS377F40344", + "DeliveryStreamName": "KinesisFirehoseevtfhss3existingengbusKinesisFirehoseToS31FCFC982", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D", "Arn" ] }, @@ -249,10 +313,10 @@ "CloudWatchLoggingOptions": { "Enabled": true, "LogGroupName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276" + "Ref": "evtfhss3existingbusKinesisFirehoseToS3firehoseloggroup796118EE" }, "LogStreamName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstream443A77D5" + "Ref": "evtfhss3existingbusKinesisFirehoseToS3firehoseloggroupfirehoselogstream93EC9AD0" } }, "CompressionFormat": "GZIP", @@ -282,14 +346,14 @@ }, "RoleARN": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRoleBCE20D0B", + "evtfhss3existingbusKinesisFirehoseToS3KinesisFirehoseRole505D9C33", "Arn" ] } } } }, - "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole2BA50856": { + "evtfhss3existingbusEventsRuleInvokeKinesisFirehoseRole7D7DF871": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -307,7 +371,7 @@ "Description": "Events Rule To Kinesis Firehose Role" } }, - "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicyFD82B8D9": { + "evtfhss3existingbusEventsRuleInvokeKinesisFirehosePolicyE307173A": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -320,7 +384,7 @@ "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseA91109C4", + "evtfhss3existingbusKinesisFirehoseToS3KinesisFirehoseA77AB0B2", "Arn" ] } @@ -328,19 +392,19 @@ ], "Version": "2012-10-17" }, - "PolicyName": "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicyFD82B8D9", + "PolicyName": "evtfhss3existingbusEventsRuleInvokeKinesisFirehosePolicyE307173A", "Roles": [ { - "Ref": "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole2BA50856" + "Ref": "evtfhss3existingbusEventsRuleInvokeKinesisFirehoseRole7D7DF871" } ] } }, - "testeventbridgekinesisfirehoses3EventsRule9641436B": { + "evtfhss3existingbusEventsRule7E0DBD3A": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": { - "Ref": "testexistingeventbusC6E4A2D0" + "Ref": "evtfhss3testexistingeventbus5123D540" }, "EventPattern": { "source": [ @@ -352,20 +416,96 @@ { "Arn": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseA91109C4", + "evtfhss3existingbusKinesisFirehoseToS3KinesisFirehoseA77AB0B2", "Arn" ] }, "Id": "Target0", "RoleArn": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole2BA50856", + "evtfhss3existingbusEventsRuleInvokeKinesisFirehoseRole7D7DF871", "Arn" ] } } ] } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "evtfhss3existingbusKinesisFirehoseToS3S3BucketD340337D" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existing-eventbus.ts similarity index 82% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existing-eventbus.ts index 10d5da35d..a46499959 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-existing-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existing-eventbus.ts @@ -21,7 +21,7 @@ import * as s3 from "aws-cdk-lib/aws-s3"; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); stack.templateOptions.description = 'Integration Test for aws-eventbridge-kinesisfirehose-s3'; -const existingEventBus = new events.EventBus(stack, `test-existing-eventbus`, { eventBusName: 'test' }); +const existingEventBus = new events.EventBus(stack, `evtfhss3test-existing-eventbus`, { eventBusName: 'evtfhss3test-existing-eventbus' }); const props: EventbridgeToKinesisFirehoseToS3Props = { eventRuleProps: { eventPattern: { @@ -30,7 +30,8 @@ const props: EventbridgeToKinesisFirehoseToS3Props = { }, existingEventBusInterface: existingEventBus, bucketProps: { - removalPolicy: RemovalPolicy.DESTROY + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY @@ -38,7 +39,7 @@ const props: EventbridgeToKinesisFirehoseToS3Props = { logS3AccessLogs: false }; -const construct = new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-kinesisfirehose-s3', props); +const construct = new EventbridgeToKinesisFirehoseToS3(stack, 'evtfhss3-existing-bus', props); const s3Bucket = construct.s3Bucket as s3.Bucket; defaults.addCfnSuppressRules(s3Bucket, [ @@ -48,4 +49,5 @@ defaults.addCfnSuppressRules(s3Bucket, [ }, ]); +defaults.SuppressCfnNagLambdaWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.expected.json index 59941168d..ee0e520f5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.expected.json @@ -96,7 +96,7 @@ "ArnLike": { "aws:SourceArn": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3existinglogbucketKinesisFirehoseToS3S3BucketC991C6BB", "Arn" ] } @@ -226,7 +226,7 @@ } } }, - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF": { + "evtfhss3existinglogbucketKinesisFirehoseToS3S3BucketC991C6BB": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -269,11 +269,11 @@ "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" }, - "testkinesisfirehoses3KinesisFirehoseToS3S3BucketPolicy46BDB29D": { + "evtfhss3existinglogbucketKinesisFirehoseToS3S3BucketPolicy99E1E27E": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF" + "Ref": "evtfhss3existinglogbucketKinesisFirehoseToS3S3BucketC991C6BB" }, "PolicyDocument": { "Statement": [ @@ -291,7 +291,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3existinglogbucketKinesisFirehoseToS3S3BucketC991C6BB", "Arn" ] }, @@ -301,7 +301,7 @@ [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3existinglogbucketKinesisFirehoseToS3S3BucketC991C6BB", "Arn" ] }, @@ -316,7 +316,7 @@ } } }, - "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5": { + "evtfhss3existinglogbucketKinesisFirehoseToS3firehoseloggroupFE82C9D5": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", @@ -335,17 +335,17 @@ } } }, - "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstreamEC0EA660": { + "evtfhss3existinglogbucketKinesisFirehoseToS3firehoseloggroupfirehoselogstreamBF053EF5": { "Type": "AWS::Logs::LogStream", "Properties": { "LogGroupName": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5" + "Ref": "evtfhss3existinglogbucketKinesisFirehoseToS3firehoseloggroupFE82C9D5" } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" }, - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRole18870C08": { + "evtfhss3existinglogbucketKinesisFirehoseToS3KinesisFirehoseRole2678D769": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -362,7 +362,7 @@ } } }, - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicyD6A1BC51": { + "evtfhss3existinglogbucketKinesisFirehoseToS3KinesisFirehosePolicy8151CDB1": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -380,7 +380,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3existinglogbucketKinesisFirehoseToS3S3BucketC991C6BB", "Arn" ] }, @@ -390,7 +390,7 @@ [ { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3existinglogbucketKinesisFirehoseToS3S3BucketC991C6BB", "Arn" ] }, @@ -421,11 +421,11 @@ }, ":log-group:", { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5" + "Ref": "evtfhss3existinglogbucketKinesisFirehoseToS3firehoseloggroupFE82C9D5" }, ":log-stream:", { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstreamEC0EA660" + "Ref": "evtfhss3existinglogbucketKinesisFirehoseToS3firehoseloggroupfirehoselogstreamBF053EF5" } ] ] @@ -434,25 +434,25 @@ ], "Version": "2012-10-17" }, - "PolicyName": "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicyD6A1BC51", + "PolicyName": "evtfhss3existinglogbucketKinesisFirehoseToS3KinesisFirehosePolicy8151CDB1", "Roles": [ { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRole18870C08" + "Ref": "evtfhss3existinglogbucketKinesisFirehoseToS3KinesisFirehoseRole2678D769" } ] } }, - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D": { + "evtfhss3existinglogbucketKinesisFirehoseToS3KinesisFirehose74C7460D": { "Type": "AWS::KinesisFirehose::DeliveryStream", "Properties": { "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseevtfhss3existingLoses3KinesisFirehoseToS3EAD9E0AB", + "DeliveryStreamName": "KinesisFirehoseevtfhss3existingLucketKinesisFirehoseToS312D80F76", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3S3Bucket303877FF", + "evtfhss3existinglogbucketKinesisFirehoseToS3S3BucketC991C6BB", "Arn" ] }, @@ -463,10 +463,10 @@ "CloudWatchLoggingOptions": { "Enabled": true, "LogGroupName": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDDB24FE5" + "Ref": "evtfhss3existinglogbucketKinesisFirehoseToS3firehoseloggroupFE82C9D5" }, "LogStreamName": { - "Ref": "testkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstreamEC0EA660" + "Ref": "evtfhss3existinglogbucketKinesisFirehoseToS3firehoseloggroupfirehoselogstreamBF053EF5" } }, "CompressionFormat": "GZIP", @@ -496,14 +496,14 @@ }, "RoleARN": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRole18870C08", + "evtfhss3existinglogbucketKinesisFirehoseToS3KinesisFirehoseRole2678D769", "Arn" ] } } } }, - "testkinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole0D8588E2": { + "evtfhss3existinglogbucketEventsRuleInvokeKinesisFirehoseRoleC08B77B1": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -521,7 +521,7 @@ "Description": "Events Rule To Kinesis Firehose Role" } }, - "testkinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicy88CA86C4": { + "evtfhss3existinglogbucketEventsRuleInvokeKinesisFirehosePolicy48DD7CD5": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -534,7 +534,7 @@ "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D", + "evtfhss3existinglogbucketKinesisFirehoseToS3KinesisFirehose74C7460D", "Arn" ] } @@ -542,15 +542,15 @@ ], "Version": "2012-10-17" }, - "PolicyName": "testkinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicy88CA86C4", + "PolicyName": "evtfhss3existinglogbucketEventsRuleInvokeKinesisFirehosePolicy48DD7CD5", "Roles": [ { - "Ref": "testkinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole0D8588E2" + "Ref": "evtfhss3existinglogbucketEventsRuleInvokeKinesisFirehoseRoleC08B77B1" } ] } }, - "testkinesisfirehoses3EventsRule05D717D1": { + "evtfhss3existinglogbucketEventsRule91588840": { "Type": "AWS::Events::Rule", "Properties": { "ScheduleExpression": "rate(5 minutes)", @@ -559,14 +559,14 @@ { "Arn": { "Fn::GetAtt": [ - "testkinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseEB65C83D", + "evtfhss3existinglogbucketKinesisFirehoseToS3KinesisFirehose74C7460D", "Arn" ] }, "Id": "Target0", "RoleArn": { "Fn::GetAtt": [ - "testkinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole0D8588E2", + "evtfhss3existinglogbucketEventsRuleInvokeKinesisFirehoseRoleC08B77B1", "Arn" ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.ts index ba4a2abfd..f416558fa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-existingLoggingBucket.ts @@ -26,7 +26,7 @@ stack.node.setContext("@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy", true); const logBucket = defaults.CreateScrapBucket(stack); -new EventbridgeToKinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { +new EventbridgeToKinesisFirehoseToS3(stack, 'evtfhss3-existing-log-bucket', { eventRuleProps: { schedule: events.Schedule.rate(Duration.minutes(5)) }, @@ -36,7 +36,7 @@ new EventbridgeToKinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY - } + }, }); defaults.suppressAutoDeleteHandlerWarnings(stack); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-new-eventbus.expected.json similarity index 62% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.expected.json rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-new-eventbus.expected.json index 054f3cf12..ca490a294 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-new-eventbus.expected.json @@ -1,7 +1,7 @@ { "Description": "Integration Test for aws-eventbridge-kinesisfirehose-s3", "Resources": { - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket703E6C44": { + "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { @@ -13,12 +13,31 @@ } ] }, + "LifecycleConfiguration": { + "Rules": [ + { + "NoncurrentVersionTransitions": [ + { + "StorageClass": "GLACIER", + "TransitionInDays": 90 + } + ], + "Status": "Enabled" + } + ] + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -30,17 +49,17 @@ "rules_to_suppress": [ { "id": "W35", - "reason": "This S3 bucket is used as the access logging bucket for another bucket" + "reason": "This S3 bucket is created for unit/ integration testing purposes only." } ] } } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3LoggingBucketPolicy1A5A1E6B": { + "evtfhss3newbusKinesisFirehoseToS3S3BucketPolicy1DB04E4C": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket703E6C44" + "Ref": "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F" }, "PolicyDocument": { "Statement": [ @@ -58,7 +77,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket703E6C44", + "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F", "Arn" ] }, @@ -68,7 +87,7 @@ [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket703E6C44", + "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F", "Arn" ] }, @@ -79,112 +98,25 @@ ] }, { - "Action": "s3:PutObject", - "Condition": { - "ArnLike": { - "aws:SourceArn": { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", - "Arn" - ] - } - }, - "StringEquals": { - "aws:SourceAccount": { - "Ref": "AWS::AccountId" - } - } - }, + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], "Effect": "Allow", "Principal": { - "Service": "logging.s3.amazonaws.com" - }, - "Resource": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket703E6C44", - "Arn" - ] - }, - "/*" + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" ] - ] - } - } - ], - "Version": "2012-10-17" - } - } - }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845": { - "Type": "AWS::S3::Bucket", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "SSEAlgorithm": "AES256" - } - } - ] - }, - "LifecycleConfiguration": { - "Rules": [ - { - "NoncurrentVersionTransitions": [ - { - "StorageClass": "GLACIER", - "TransitionInDays": 90 - } - ], - "Status": "Enabled" - } - ] - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3LoggingBucket703E6C44" - } - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true - }, - "VersioningConfiguration": { - "Status": "Enabled" - } - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete" - }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketPolicy6ECA7017": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "Bucket": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845" - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false" } }, - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, "Resource": [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F", "Arn" ] }, @@ -194,7 +126,7 @@ [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F", "Arn" ] }, @@ -209,7 +141,26 @@ } } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276": { + "evtfhss3newbusKinesisFirehoseToS3S3BucketAutoDeleteObjectsCustomResourceF47E05EB": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F" + } + }, + "DependsOn": [ + "evtfhss3newbusKinesisFirehoseToS3S3BucketPolicy1DB04E4C" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "evtfhss3newbusKinesisFirehoseToS3firehoseloggroup3A050464": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", @@ -228,17 +179,17 @@ } } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstream443A77D5": { + "evtfhss3newbusKinesisFirehoseToS3firehoseloggroupfirehoselogstream3F3D7EB2": { "Type": "AWS::Logs::LogStream", "Properties": { "LogGroupName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276" + "Ref": "evtfhss3newbusKinesisFirehoseToS3firehoseloggroup3A050464" } }, "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain" }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRoleBCE20D0B": { + "evtfhss3newbusKinesisFirehoseToS3KinesisFirehoseRole0D6F5A2A": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -255,7 +206,7 @@ } } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicy9DC1B594": { + "evtfhss3newbusKinesisFirehoseToS3KinesisFirehosePolicy30D0D9A0": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -273,7 +224,7 @@ "Resource": [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F", "Arn" ] }, @@ -283,7 +234,7 @@ [ { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F", "Arn" ] }, @@ -314,11 +265,11 @@ }, ":log-group:", { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276" + "Ref": "evtfhss3newbusKinesisFirehoseToS3firehoseloggroup3A050464" }, ":log-stream:", { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstream443A77D5" + "Ref": "evtfhss3newbusKinesisFirehoseToS3firehoseloggroupfirehoselogstream3F3D7EB2" } ] ] @@ -327,25 +278,25 @@ ], "Version": "2012-10-17" }, - "PolicyName": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehosePolicy9DC1B594", + "PolicyName": "evtfhss3newbusKinesisFirehoseToS3KinesisFirehosePolicy30D0D9A0", "Roles": [ { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRoleBCE20D0B" + "Ref": "evtfhss3newbusKinesisFirehoseToS3KinesisFirehoseRole0D6F5A2A" } ] } }, - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseA91109C4": { + "evtfhss3newbusKinesisFirehoseToS3KinesisFirehose0103145F": { "Type": "AWS::KinesisFirehose::DeliveryStream", "Properties": { "DeliveryStreamEncryptionConfigurationInput": { "KeyType": "AWS_OWNED_CMK" }, - "DeliveryStreamName": "KinesisFirehoseevtfhss3eventbridoses3KinesisFirehoseToS3BF3B2749", + "DeliveryStreamName": "KinesisFirehoseevtfhss3neweventbewbusKinesisFirehoseToS3CE717271", "ExtendedS3DestinationConfiguration": { "BucketARN": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3S3BucketF3A3F845", + "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F", "Arn" ] }, @@ -356,10 +307,10 @@ "CloudWatchLoggingOptions": { "Enabled": true, "LogGroupName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupA843D276" + "Ref": "evtfhss3newbusKinesisFirehoseToS3firehoseloggroup3A050464" }, "LogStreamName": { - "Ref": "testeventbridgekinesisfirehoses3KinesisFirehoseToS3firehoseloggroupfirehoselogstream443A77D5" + "Ref": "evtfhss3newbusKinesisFirehoseToS3firehoseloggroupfirehoselogstream3F3D7EB2" } }, "CompressionFormat": "GZIP", @@ -389,14 +340,14 @@ }, "RoleARN": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseRoleBCE20D0B", + "evtfhss3newbusKinesisFirehoseToS3KinesisFirehoseRole0D6F5A2A", "Arn" ] } } } }, - "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole2BA50856": { + "evtfhss3newbusEventsRuleInvokeKinesisFirehoseRoleE0C3E7F4": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -414,7 +365,7 @@ "Description": "Events Rule To Kinesis Firehose Role" } }, - "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicyFD82B8D9": { + "evtfhss3newbusEventsRuleInvokeKinesisFirehosePolicyF9AC0857": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -427,7 +378,7 @@ "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseA91109C4", + "evtfhss3newbusKinesisFirehoseToS3KinesisFirehose0103145F", "Arn" ] } @@ -435,37 +386,126 @@ ], "Version": "2012-10-17" }, - "PolicyName": "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehosePolicyFD82B8D9", + "PolicyName": "evtfhss3newbusEventsRuleInvokeKinesisFirehosePolicyF9AC0857", "Roles": [ { - "Ref": "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole2BA50856" + "Ref": "evtfhss3newbusEventsRuleInvokeKinesisFirehoseRoleE0C3E7F4" } ] } }, - "testeventbridgekinesisfirehoses3EventsRule9641436B": { + "evtfhss3newbusevtfhss3neweventbusDF98CF38": { + "Type": "AWS::Events::EventBus", + "Properties": { + "Name": "evtfhss3-new-eventbus" + } + }, + "evtfhss3newbusEventsRule997850BF": { "Type": "AWS::Events::Rule", "Properties": { - "ScheduleExpression": "rate(5 minutes)", + "EventBusName": { + "Ref": "evtfhss3newbusevtfhss3neweventbusDF98CF38" + }, + "EventPattern": { + "source": [ + "solutionsconstructs" + ] + }, "State": "ENABLED", "Targets": [ { "Arn": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3KinesisFirehoseToS3KinesisFirehoseA91109C4", + "evtfhss3newbusKinesisFirehoseToS3KinesisFirehose0103145F", "Arn" ] }, "Id": "Target0", "RoleArn": { "Fn::GetAtt": [ - "testeventbridgekinesisfirehoses3EventsRuleInvokeKinesisFirehoseRole2BA50856", + "evtfhss3newbusEventsRuleInvokeKinesisFirehoseRoleE0C3E7F4", "Arn" ] } } ] } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "evtfhss3newbusKinesisFirehoseToS3S3Bucket7852316F" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-new-eventbus.ts similarity index 83% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-new-eventbus.ts index 6fcb38bef..de384508d 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-new-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-new-eventbus.ts @@ -27,17 +27,18 @@ const props: EventbridgeToKinesisFirehoseToS3Props = { source: ['solutionsconstructs'] } }, - eventBusProps: { eventBusName: 'test' }, + eventBusProps: { eventBusName: 'evtfhss3-new-eventbus' }, bucketProps: { - removalPolicy: RemovalPolicy.DESTROY + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, }, logGroupProps: { - removalPolicy: RemovalPolicy.DESTROY + removalPolicy: RemovalPolicy.DESTROY, }, logS3AccessLogs: false }; -const construct = new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-kinesisfirehose-s3', props); +const construct = new EventbridgeToKinesisFirehoseToS3(stack, 'evtfhss3-new-bus', props); const s3Bucket = construct.s3Bucket as s3.Bucket; defaults.addCfnSuppressRules(s3Bucket, [ @@ -47,4 +48,5 @@ defaults.addCfnSuppressRules(s3Bucket, [ }, ]); +defaults.SuppressCfnNagLambdaWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-no-arguments.expected.json new file mode 100644 index 000000000..f6aa92223 --- /dev/null +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-no-arguments.expected.json @@ -0,0 +1,709 @@ +{ + "Description": "Integration Test for aws-eventbridge-kinesisfirehose-s3", + "Resources": { + "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W35", + "reason": "This S3 bucket is used as the access logging bucket for another bucket" + } + ] + } + } + }, + "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketPolicy3425413F": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "s3:PutObject", + "Condition": { + "ArnLike": { + "aws:SourceArn": { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335", + "Arn" + ] + } + }, + "StringEquals": { + "aws:SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com" + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6", + "Arn" + ] + }, + "/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + }, + "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketAutoDeleteObjectsCustomResourceA57885E4": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6" + } + }, + "DependsOn": [ + "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketPolicy3425413F" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + }, + "LifecycleConfiguration": { + "Rules": [ + { + "NoncurrentVersionTransitions": [ + { + "StorageClass": "GLACIER", + "TransitionInDays": 90 + } + ], + "Status": "Enabled" + } + ] + }, + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6" + } + }, + "PublicAccessBlockConfiguration": { + "BlockPublicAcls": true, + "BlockPublicPolicy": true, + "IgnorePublicAcls": true, + "RestrictPublicBuckets": true + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], + "VersioningConfiguration": { + "Status": "Enabled" + } + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "evtfhss3noargsKinesisFirehoseToS3S3BucketPolicy41E50200": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false" + } + }, + "Effect": "Deny", + "Principal": { + "AWS": "*" + }, + "Resource": [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + } + ], + "Version": "2012-10-17" + } + } + }, + "evtfhss3noargsKinesisFirehoseToS3S3BucketAutoDeleteObjectsCustomResource08120EF0": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335" + } + }, + "DependsOn": [ + "evtfhss3noargsKinesisFirehoseToS3S3BucketPolicy41E50200" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "evtfhss3noargsKinesisFirehoseToS3firehoseloggroupD59B2681": { + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete", + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W86", + "reason": "Retention period for CloudWatchLogs LogGroups are set to 'Never Expire' to preserve customer data indefinitely" + }, + { + "id": "W84", + "reason": "By default CloudWatchLogs LogGroups data is encrypted using the CloudWatch server-side encryption keys (AWS Managed Keys)" + } + ] + } + } + }, + "evtfhss3noargsKinesisFirehoseToS3firehoseloggroupfirehoselogstream5F1ABE6A": { + "Type": "AWS::Logs::LogStream", + "Properties": { + "LogGroupName": { + "Ref": "evtfhss3noargsKinesisFirehoseToS3firehoseloggroupD59B2681" + } + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "evtfhss3noargsKinesisFirehoseToS3KinesisFirehoseRoleA1D4DAD3": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "firehose.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "evtfhss3noargsKinesisFirehoseToS3KinesisFirehosePolicy9348D9A7": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:AbortMultipartUpload", + "s3:GetBucketLocation", + "s3:GetObject", + "s3:ListBucket", + "s3:ListBucketMultipartUploads", + "s3:PutObject" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, + { + "Action": "logs:PutLogEvents", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":logs:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":log-group:", + { + "Ref": "evtfhss3noargsKinesisFirehoseToS3firehoseloggroupD59B2681" + }, + ":log-stream:", + { + "Ref": "evtfhss3noargsKinesisFirehoseToS3firehoseloggroupfirehoselogstream5F1ABE6A" + } + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "evtfhss3noargsKinesisFirehoseToS3KinesisFirehosePolicy9348D9A7", + "Roles": [ + { + "Ref": "evtfhss3noargsKinesisFirehoseToS3KinesisFirehoseRoleA1D4DAD3" + } + ] + } + }, + "evtfhss3noargsKinesisFirehoseToS3KinesisFirehose79B86E73": { + "Type": "AWS::KinesisFirehose::DeliveryStream", + "Properties": { + "DeliveryStreamEncryptionConfigurationInput": { + "KeyType": "AWS_OWNED_CMK" + }, + "DeliveryStreamName": "KinesisFirehoseevtfhss3noargumenoargsKinesisFirehoseToS382971C8C", + "ExtendedS3DestinationConfiguration": { + "BucketARN": { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3S3Bucket0C77A335", + "Arn" + ] + }, + "BufferingHints": { + "IntervalInSeconds": 300, + "SizeInMBs": 5 + }, + "CloudWatchLoggingOptions": { + "Enabled": true, + "LogGroupName": { + "Ref": "evtfhss3noargsKinesisFirehoseToS3firehoseloggroupD59B2681" + }, + "LogStreamName": { + "Ref": "evtfhss3noargsKinesisFirehoseToS3firehoseloggroupfirehoselogstream5F1ABE6A" + } + }, + "CompressionFormat": "GZIP", + "EncryptionConfiguration": { + "KMSEncryptionConfig": { + "AWSKMSKeyARN": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":kms:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":alias/aws/s3" + ] + ] + } + } + }, + "RoleARN": { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3KinesisFirehoseRoleA1D4DAD3", + "Arn" + ] + } + } + } + }, + "evtfhss3noargsEventsRuleInvokeKinesisFirehoseRole5581D76F": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Description": "Events Rule To Kinesis Firehose Role" + } + }, + "evtfhss3noargsEventsRuleInvokeKinesisFirehosePolicy7EDDB514": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "firehose:PutRecord", + "firehose:PutRecordBatch" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3KinesisFirehose79B86E73", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "evtfhss3noargsEventsRuleInvokeKinesisFirehosePolicy7EDDB514", + "Roles": [ + { + "Ref": "evtfhss3noargsEventsRuleInvokeKinesisFirehoseRole5581D76F" + } + ] + } + }, + "evtfhss3noargsEventsRule810B5DF6": { + "Type": "AWS::Events::Rule", + "Properties": { + "ScheduleExpression": "rate(5 minutes)", + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ + "evtfhss3noargsKinesisFirehoseToS3KinesisFirehose79B86E73", + "Arn" + ] + }, + "Id": "Target0", + "RoleArn": { + "Fn::GetAtt": [ + "evtfhss3noargsEventsRuleInvokeKinesisFirehoseRole5581D76F", + "Arn" + ] + } + } + ] + } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "evtfhss3noargsKinesisFirehoseToS3S3LoggingBucketD8CDDAC6" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + } + }, + "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." + } + ] + } + } +} \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-no-arguments.ts similarity index 73% rename from source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.ts rename to source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-no-arguments.ts index 7ad3230c4..aea50258c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-eventbridge-kinesisfirehose-s3-no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisfirehose-s3/test/integ.evtfhss3-no-arguments.ts @@ -14,7 +14,7 @@ import * as events from 'aws-cdk-lib/aws-events'; import { App, Stack, Duration, RemovalPolicy } from 'aws-cdk-lib'; import { EventbridgeToKinesisFirehoseToS3, EventbridgeToKinesisFirehoseToS3Props } from '../lib'; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { SuppressCfnNagLambdaWarnings, generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); @@ -25,13 +25,19 @@ const props: EventbridgeToKinesisFirehoseToS3Props = { schedule: events.Schedule.rate(Duration.minutes(5)) }, logGroupProps: { - removalPolicy: RemovalPolicy.DESTROY + removalPolicy: RemovalPolicy.DESTROY, }, bucketProps: { - removalPolicy: RemovalPolicy.DESTROY + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, } }; -new EventbridgeToKinesisFirehoseToS3(stack, 'test-eventbridge-kinesisfirehose-s3', props); +new EventbridgeToKinesisFirehoseToS3(stack, 'evtfhss3-no-args', props); +SuppressCfnNagLambdaWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.expected.json index 093123e2b..1cfacce5e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.expected.json @@ -15,7 +15,7 @@ "existingeventbusA5B80487": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "evtkineventbridgekinesisstreamsexistingeventbusexistingeventbusC29BC600" } }, "testeventbridgekinesisstreamexistingeventsRoleDFC1450E": { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.ts index fa3deb429..30478cd49 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-existing-eventbus.ts @@ -26,7 +26,7 @@ const stream = new kinesis.Stream(stack, 'test-stream', { encryption: kinesis.StreamEncryption.MANAGED }); -const existingEventBus = new events.EventBus(stack, `existing-event-bus`, { eventBusName: 'test' }); +const existingEventBus = new events.EventBus(stack, `existing-event-bus`, { }); const props: EventbridgeToKinesisStreamsProps = { eventRuleProps: { eventPattern: { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.expected.json index 37362f5ee..26171f246 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.expected.json @@ -60,17 +60,17 @@ ] } }, - "testeventbridgekinesisstreamtestDC87749D": { + "testeventbridgekinesisstreamCustomEventBus591309EC": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "evtkineventbridgekinesisstreamsneweventbustesteventbridgekinesisstreamCustomEventBusB97FD040" } }, "testeventbridgekinesisstreamEventsRuleC4E74981": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": { - "Ref": "testeventbridgekinesisstreamtestDC87749D" + "Ref": "testeventbridgekinesisstreamCustomEventBus591309EC" }, "EventPattern": { "source": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.ts index 098ccf130..1081de899 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-kinesisstreams/test/integ.evtkin-eventbridge-kinesisstreams-new-eventbus.ts @@ -25,7 +25,7 @@ const props: EventbridgeToKinesisStreamsProps = { source: ['solutionsconstructs'] } }, - eventBusProps: { eventBusName: 'test' } + eventBusProps: { } }; new EventbridgeToKinesisStreams(stack, 'test-eventbridge-kinesis-stream', props); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.expected.json index ea66e7bec..20f72c921 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.expected.json @@ -3,7 +3,7 @@ "existingeventbusA5B80487": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "evtsnsexistbusexistingeventbusEAEACB72" } }, "testconstructEncryptionKey6153B053": { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.ts index 76a7d31d1..805a42700 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-exist-bus.ts @@ -19,7 +19,7 @@ import { generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); // Create existing custom EventBus -const existingEventBus = new events.EventBus(stack, `existing-event-bus`, { eventBusName: 'test' }); +const existingEventBus = new events.EventBus(stack, `existing-event-bus`); const props: EventbridgeToSnsProps = { eventRuleProps: { eventPattern: { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.expected.json index a1ef80ba0..6faa5c064 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.expected.json @@ -155,17 +155,17 @@ ] } }, - "testconstructtest167F6979": { + "testconstructCustomEventBusFBDE2130": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "evtsnsnewbustestconstructCustomEventBus56EA651C" } }, "testconstructEventsRule145DBA20": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": { - "Ref": "testconstructtest167F6979" + "Ref": "testconstructCustomEventBusFBDE2130" }, "EventPattern": { "source": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.ts index ac02b881b..099745367 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sns/test/integ.evtsns-new-bus.ts @@ -24,7 +24,7 @@ const props: EventbridgeToSnsProps = { source: ['solutionsconstructs'] } }, - eventBusProps: { eventBusName: 'test' } // Pass props to create new custom EventBus + eventBusProps: {} // Pass props to create new custom EventBus }; new EventbridgeToSns(stack, 'test-construct', props); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.expected.json index b63928b31..418f4ef5b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.expected.json @@ -97,7 +97,7 @@ "existingeventbusA5B80487": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "evtsqsexistbusexistingeventbus730F622B" } }, "constructEventsRule43880ADB": { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.ts index 9943d44d5..9a82226a0 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-exist-bus.ts @@ -28,7 +28,7 @@ const existingQueueObj = new sqs.Queue(stack, 'MyQueue', { }), }); -const existingEventBus = new events.EventBus(stack, 'existing-event-bus', { eventBusName: 'test' }); +const existingEventBus = new events.EventBus(stack, 'existing-event-bus', {}); const props: EventbridgeToSqsProps = { eventRuleProps: { eventPattern: { diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.expected.json index 0abe9486a..649a9d56a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.expected.json @@ -238,17 +238,17 @@ ] } }, - "constructtestD7FE2822": { + "constructCustomEventBusA674C94A": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "evtsqsnewbusconstructCustomEventBus3025C22E" } }, "constructEventsRule43880ADB": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": { - "Ref": "constructtestD7FE2822" + "Ref": "constructCustomEventBusA674C94A" }, "EventPattern": { "source": [ diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.ts index dcb2d63e5..c6b07736e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-sqs/test/integ.evtsqs-new-bus.ts @@ -24,7 +24,7 @@ const props: EventbridgeToSqsProps = { source: ['solutionsconstructs'] } }, - eventBusProps: { eventBusName: 'test' } + eventBusProps: {} }; new EventbridgeToSqs(stack, 'construct', props); diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.expected.json index dee9dbace..740426bad 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.expected.json @@ -147,7 +147,27 @@ "testeventbridgestepfunctionsneweventbusconstructStateMachineLogGroup6DC6AD59": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "integ-test-existing-eventbus" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/evtstp-eventbridge-stepfunctions-existing-eventbustest-eventbridge-stepfunctions-new-eventbus-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.ts index d4f52042f..a8b95102a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-existing-eventbus.ts @@ -51,7 +51,6 @@ const props: EventbridgeToStepfunctionsProps = { existingEventBusInterface: existingEventBus, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "integ-test-existing-eventbus" }, }; diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.expected.json index 82b3ca7cd..8c64dc03a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.expected.json @@ -141,7 +141,27 @@ "testeventbridgestepfunctionsneweventbusconstructStateMachineLogGroup6DC6AD59": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "integ-test-new-eventbus" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/evtstp-eventbridge-stepfunctions-new-eventbustest-eventbridge-stepfunctions-new-eventbus-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.ts index 6a1b5614a..e78df8973 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-new-eventbus.ts @@ -49,7 +49,6 @@ const props: EventbridgeToStepfunctionsProps = { eventBusProps: { eventBusName: 'test-new' }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "integ-test-new-eventbus" }, }; diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.expected.json b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.expected.json index 21d73496a..52d107ad3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.expected.json @@ -141,7 +141,27 @@ "testeventbridgestepfunctionsandlambdaconstructStateMachineLogGroup7C2D036A": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "with-lambda" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/evtstp-eventbridge-stepfunctions-with-lambdatest-eventbridge-stepfunctions-and-lambda-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.ts b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.ts index 3cd9c28b1..429fb8417 100644 --- a/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.ts +++ b/source/patterns/@aws-solutions-constructs/aws-eventbridge-stepfunctions/test/integ.evtstp-eventbridge-stepfunctions-with-lambda.ts @@ -47,7 +47,6 @@ const props: EventbridgeToStepfunctionsProps = { }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "with-lambda" }, }; diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.expected.json index 00695cbad..23f6cc583 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.expected.json @@ -1088,7 +1088,7 @@ "existingeventbusA5B80487": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "farevtexistingresourcesexistingeventbusBF80696A" } }, "farevtexistingresourcesCLOUDWATCHEVENTSsecuritygroup33E6AE58": { diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.ts index 8a4f9e2f8..71736fe02 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-eventbridge/test/integ.farevt-existing-resources.ts @@ -33,7 +33,7 @@ const createFargateServiceResponse = CreateFargateService(stack, 'test', { clientContainerDefinitionProps: { image }, }); -const existingEventBus = new events.EventBus(stack, 'existing-event-bus', { eventBusName: 'test' }); +const existingEventBus = new events.EventBus(stack, 'existing-event-bus', {}); const testProps: FargateToEventbridgeProps = { publicApi: true, diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.expected.json index aab3d48e4..d00d7a989 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.expected.json @@ -19,6 +19,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -78,6 +84,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testconstructS3LoggingBucketD59856DF", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testconstructS3LoggingBucketD59856DF", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -119,6 +164,25 @@ } } }, + "testconstructS3LoggingBucketAutoDeleteObjectsCustomResourceD451B199": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testconstructS3LoggingBucketD59856DF" + } + }, + "DependsOn": [ + "testconstructS3LoggingBucketPolicy02741E92" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testconstructS3Bucket81E8552A": { "Type": "AWS::S3::Bucket", "Properties": { @@ -1406,7 +1470,7 @@ [ "Lambda function for auto-deleting objects in ", { - "Ref": "testconstructS3Bucket81E8552A" + "Ref": "testconstructS3LoggingBucketD59856DF" }, " S3 bucket." ] diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.ts index 8bf720c95..45fed00cf 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-s3/test/integ.fars3-new-resources.ts @@ -35,6 +35,10 @@ const testProps: FargateToS3Props = { removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true + }, }; new FargateToS3(stack, 'test-construct', testProps); diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.expected.json b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.expected.json index 86cfc4810..f81e50b24 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.expected.json @@ -1085,7 +1085,27 @@ "testconstructStateMachineLogGroup2EB4F48B": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "with-lambda" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/farstp-no-cloudwatch-alarmstest-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.ts b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.ts index 8f74073a7..db0ff0d51 100644 --- a/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.ts +++ b/source/patterns/@aws-solutions-constructs/aws-fargate-stepfunctions/test/integ.farstp-no-cloudwatch-alarms.ts @@ -47,7 +47,6 @@ const constructProps: FargateToStepfunctionsProps = { createCloudWatchAlarms: false, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "with-lambda" } }; diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json index 6be801e71..909a89475 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.expected.json @@ -12,7 +12,7 @@ } ] }, - "BucketName": "custom-logging-bucket", + "BucketName": "iotfhss3-customloggingbucket-custom-logging-bucket", "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts index 8d1d2754e..3c6b3a6f5 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-customLoggingBucket.ts @@ -37,7 +37,7 @@ new IotToKinesisFirehoseToS3(stack, 'test-iot-kinesisfirehose-s3', { loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true, - bucketName: 'custom-logging-bucket', + bucketName: `${generateIntegStackName(__filename).toLowerCase()}-custom-logging-bucket`, encryption: BucketEncryption.S3_MANAGED, versioned: true } diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.expected.json index 394bd18c2..b45bf550a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.expected.json @@ -19,6 +19,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -78,6 +84,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testiotfirehoses3KinesisFirehoseToS3S3LoggingBucketC786B050", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testiotfirehoses3KinesisFirehoseToS3S3LoggingBucketC786B050", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -119,6 +164,25 @@ } } }, + "testiotfirehoses3KinesisFirehoseToS3S3LoggingBucketAutoDeleteObjectsCustomResource1CDEA6AE": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testiotfirehoses3KinesisFirehoseToS3S3LoggingBucketC786B050" + } + }, + "DependsOn": [ + "testiotfirehoses3KinesisFirehoseToS3S3LoggingBucketPolicyE5A94728" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testiotfirehoses3KinesisFirehoseToS3S3Bucket19C97D09": { "Type": "AWS::S3::Bucket", "Properties": { @@ -155,6 +219,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -203,12 +273,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testiotfirehoses3KinesisFirehoseToS3S3Bucket19C97D09", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testiotfirehoses3KinesisFirehoseToS3S3Bucket19C97D09", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "testiotfirehoses3KinesisFirehoseToS3S3BucketAutoDeleteObjectsCustomResourceF96C70D4": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testiotfirehoses3KinesisFirehoseToS3S3Bucket19C97D09" + } + }, + "DependsOn": [ + "testiotfirehoses3KinesisFirehoseToS3S3BucketPolicy39975CE7" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testiotfirehoses3KinesisFirehoseToS3firehoseloggroup4A2E4212": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", @@ -463,6 +591,82 @@ "Sql": "SELECT * FROM 'connectedcar/telemetry/#'" } } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "testiotfirehoses3KinesisFirehoseToS3S3LoggingBucketC786B050" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.ts index 25cdf34df..d2d579701 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-no-arguments.ts @@ -14,7 +14,7 @@ // Imports import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { IotToKinesisFirehoseToS3, IotToKinesisFirehoseToS3Props } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { SuppressCfnNagLambdaWarnings, generateIntegStackName } from '@aws-solutions-constructs/core'; // Setup const app = new App(); @@ -32,11 +32,17 @@ const props: IotToKinesisFirehoseToS3Props = { } }, bucketProps: { - removalPolicy: RemovalPolicy.DESTROY + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, } }; new IotToKinesisFirehoseToS3(stack, 'test-iot-firehose-s3', props); +SuppressCfnNagLambdaWarnings(stack); // Synth app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.expected.json index 93b903875..69b45ef9a 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.expected.json @@ -31,6 +31,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -89,12 +95,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "testiotkinesisfirehoses3KinesisFirehoseToS3S3BucketAEE2D91B", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "testiotkinesisfirehoses3KinesisFirehoseToS3S3BucketAEE2D91B", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "testiotkinesisfirehoses3KinesisFirehoseToS3S3BucketAutoDeleteObjectsCustomResourceB38DFE2A": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "testiotkinesisfirehoses3KinesisFirehoseToS3S3BucketAEE2D91B" + } + }, + "DependsOn": [ + "testiotkinesisfirehoses3KinesisFirehoseToS3S3BucketPolicy8BDDB6C2" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "testiotkinesisfirehoses3KinesisFirehoseToS3firehoseloggroupDD0940D4": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", @@ -349,6 +413,82 @@ "Sql": "SELECT * FROM 'connectedcar/telemetry/#'" } } + }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "testiotkinesisfirehoses3KinesisFirehoseToS3S3BucketAEE2D91B" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } } }, "Parameters": { diff --git a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.ts index 539bbc53d..1d4934047 100644 --- a/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-iot-kinesisfirehose-s3/test/integ.iotfhss3-noLoggingBucket.ts @@ -34,6 +34,7 @@ const construct = new IotToKinesisFirehoseToS3(stack, 'test-iot-kinesisfirehose- }, bucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true }, logS3AccessLogs: false }); @@ -47,4 +48,5 @@ defaults.addCfnSuppressRules(s3Bucket, [ }, ]); +defaults.SuppressCfnNagLambdaWarnings(stack); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json index e417e124b..b13ff1372 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.expected.json @@ -219,6 +219,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -267,12 +273,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "firstconstructS3Bucket58522C24", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "firstconstructS3Bucket58522C24", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "firstconstructS3BucketAutoDeleteObjectsCustomResourceB053DF99": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "firstconstructS3Bucket58522C24" + } + }, + "DependsOn": [ + "firstconstructS3BucketPolicyC7BBECCF" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "firstconstructfirehoseloggroup6E34E778": { "Type": "AWS::Logs::LogGroup", "UpdateReplacePolicy": "Retain", diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts index a2b99fefb..a18c4f9b9 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisfirehose-s3/test/integ.fhss3-two-instances.ts @@ -23,6 +23,7 @@ stack.templateOptions.description = 'Integration Test for aws-cdk-apl-kinesisfir new KinesisFirehoseToS3(stack, 'first-construct', { bucketProps: { + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, }, loggingBucketProps: { diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json index 483facbd8..acd9b0194 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.expected.json @@ -23,7 +23,6 @@ } ] }, - "BucketName": "custom-logging-bucket", "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts index 35468edf7..52597fe33 100644 --- a/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3/test/integ.kinfhss3-customLoggingBucket.ts @@ -29,7 +29,6 @@ new KinesisStreamsToKinesisFirehoseToS3(stack, 'test-kinesisfirehose-s3', { loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true, - bucketName: 'custom-logging-bucket', encryption: BucketEncryption.S3_MANAGED, versioned: true }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.expected.json index 939de6d5f..c7e00a5ff 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.expected.json @@ -85,7 +85,7 @@ "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "testlambdaeventbridgetest01C41A39", + "testlambdaeventbridgeCustomEventBus5F110E81", "Arn" ] } @@ -154,7 +154,7 @@ "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "EVENTBUS_NAME": { - "Ref": "testlambdaeventbridgetest01C41A39" + "Ref": "testlambdaeventbridgeCustomEventBus5F110E81" } } }, @@ -217,10 +217,10 @@ } } }, - "testlambdaeventbridgetest01C41A39": { + "testlambdaeventbridgeCustomEventBus5F110E81": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "lamevtdeployFunctionWithNewEventBustestlambdaeventbridgeCustomEventBus456908C5" } }, "Vpc8378EB38": { diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.ts index 28bed792c..2b2094911 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-deployFunctionWithNewEventBus.ts @@ -30,7 +30,7 @@ const props: LambdaToEventbridgeProps = { code: lambda.Code.fromAsset(`${__dirname}/lambda`), }, deployVpc: true, - eventBusProps: { eventBusName: 'test' } + eventBusProps: {} }; new LambdaToEventbridge(stack, "test-lambda-eventbridge", props); diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.expected.json index 5f3d822d0..eee707e33 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.expected.json @@ -155,7 +155,7 @@ "existingeventbusA5B80487": { "Type": "AWS::Events::EventBus", "Properties": { - "Name": "test" + "Name": "lamevtexistingEventBusexistingeventbus4F320E96" } } }, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.ts index 07afdb8e4..90b75cb80 100755 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-eventbridge/test/integ.lamevt-existingEventBus.ts @@ -32,7 +32,7 @@ const lambdaFunctionProps = { }; const existingFunction = defaults.deployLambdaFunction(stack, lambdaFunctionProps); -const existingEventBus = new events.EventBus(stack, 'existing-event-bus', { eventBusName: 'test' }); +const existingEventBus = new events.EventBus(stack, 'existing-event-bus', {}); const props: LambdaToEventbridgeProps = { existingLambdaObj: existingFunction, diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.expected.json index 4a4691fc8..9053d323b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.expected.json @@ -4,7 +4,27 @@ "testlambdastepfunctionsStateMachineLogGroupD3F22A89": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "with-lambda" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/lamstp-deployFunctionWithVpctest-lambda-stepfunctionsStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.ts index b22b1652b..bf91bcbbd 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-deployFunctionWithVpc.ts @@ -39,7 +39,6 @@ const props: LambdaToStepfunctionsProps = { deployVpc: true, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "with-lambda" } }; diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.expected.json b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.expected.json index 76331499d..9e5324c37 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.expected.json @@ -151,7 +151,27 @@ "testlambdastepfunctionsconstructStateMachineLogGroup1FD4C0D4": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "with-lambda" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/lamstp-existing-functiontest-lambda-stepfunctions-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.ts b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.ts index 5c7fea70e..c74e615ab 100644 --- a/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.ts +++ b/source/patterns/@aws-solutions-constructs/aws-lambda-stepfunctions/test/integ.lamstp-existing-function.ts @@ -44,7 +44,6 @@ const props: LambdaToStepfunctionsProps = { }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "with-lambda" } }; diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.expected.json index 354335412..0786bd91b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.expected.json @@ -181,6 +181,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -240,6 +246,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -281,6 +326,25 @@ } } }, + "tests3snsS3LoggingBucketAutoDeleteObjectsCustomResourceFEE6B95B": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + } + }, + "DependsOn": [ + "tests3snsS3LoggingBucketPolicyA32283D9" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3Bucket4CA10A65": { "Type": "AWS::S3::Bucket", "Properties": { @@ -317,6 +381,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -365,12 +435,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3snsS3BucketAutoDeleteObjectsCustomResource43654954": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3Bucket4CA10A65" + } + }, + "DependsOn": [ + "tests3snsS3BucketPolicyA51165A8" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3BucketNotificationsFCF8E340": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -402,6 +530,82 @@ "SnsTopic2C1570A4" ] }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -499,6 +703,18 @@ { "id": "W92", "reason": "Impossible for us to define the correct concurrency for clients" + }, + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" } ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.ts index 2aa47961c..aff9f6762 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingSnsTopic.ts @@ -29,8 +29,14 @@ new S3ToSns(stack, 'test-s3-sns', { existingTopicObj: buildTopicResponse.topic, existingTopicEncryptionKey, bucketProps: { + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY - } + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }, }); +defaults.SuppressCfnNagLambdaWarnings(stack); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.expected.json index d9190d342..e06f18231 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.expected.json @@ -67,6 +67,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -126,6 +132,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -167,6 +212,25 @@ } } }, + "tests3snsS3LoggingBucketAutoDeleteObjectsCustomResourceFEE6B95B": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + } + }, + "DependsOn": [ + "tests3snsS3LoggingBucketPolicyA32283D9" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3Bucket4CA10A65": { "Type": "AWS::S3::Bucket", "Properties": { @@ -203,6 +267,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -251,12 +321,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3snsS3BucketAutoDeleteObjectsCustomResource43654954": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3Bucket4CA10A65" + } + }, + "DependsOn": [ + "tests3snsS3BucketPolicyA51165A8" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3BucketNotificationsFCF8E340": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -288,6 +416,82 @@ "TopicBFC7AF6E" ] }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -385,6 +589,18 @@ { "id": "W92", "reason": "Impossible for us to define the correct concurrency for clients" + }, + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" } ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.ts index ccee8e6e2..33899e68c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-existingUnencryptedSnsTopic.ts @@ -14,7 +14,7 @@ /// !cdk-integ * import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { S3ToSns } from "../lib"; -import { addCfnSuppressRules, generateIntegStackName } from '@aws-solutions-constructs/core'; +import { SuppressCfnNagLambdaWarnings, addCfnSuppressRules, generateIntegStackName } from '@aws-solutions-constructs/core'; import * as sns from 'aws-cdk-lib/aws-sns'; const app = new App(); @@ -26,8 +26,14 @@ addCfnSuppressRules(existingTopicObj, [ { id: "W47", reason: "This test intentio new S3ToSns(stack, 'test-s3-sns', { existingTopicObj, bucketProps: { + autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY - } + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }, }); +SuppressCfnNagLambdaWarnings(stack); app.synth(); \ No newline at end of file diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.expected.json index da9251c4a..76997dc0b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.expected.json @@ -18,6 +18,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -77,6 +83,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -118,6 +163,25 @@ } } }, + "tests3snsS3LoggingBucketAutoDeleteObjectsCustomResourceFEE6B95B": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + } + }, + "DependsOn": [ + "tests3snsS3LoggingBucketPolicyA32283D9" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3Bucket4CA10A65": { "Type": "AWS::S3::Bucket", "Properties": { @@ -154,6 +218,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -202,12 +272,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3snsS3BucketAutoDeleteObjectsCustomResource43654954": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3Bucket4CA10A65" + } + }, + "DependsOn": [ + "tests3snsS3BucketPolicyA51165A8" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3BucketNotificationsFCF8E340": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -403,6 +531,82 @@ ] } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -500,6 +704,18 @@ { "id": "W92", "reason": "Impossible for us to define the correct concurrency for clients" + }, + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" } ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.ts index 4d17b8578..d8ccf03da 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-newTopicFromProps.ts @@ -14,7 +14,7 @@ /// !cdk-integ * import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { S3ToSns } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { SuppressCfnNagLambdaWarnings, generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); @@ -22,10 +22,16 @@ const stack = new Stack(app, generateIntegStackName(__filename)); new S3ToSns(stack, 'test-s3-sns', { bucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, }, topicProps: { topicName: 'new-topic-from-props' } }); +SuppressCfnNagLambdaWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.expected.json index 678527ff8..6b4850eac 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.expected.json @@ -18,6 +18,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -77,6 +83,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -118,6 +163,25 @@ } } }, + "tests3snsS3LoggingBucketAutoDeleteObjectsCustomResourceFEE6B95B": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + } + }, + "DependsOn": [ + "tests3snsS3LoggingBucketPolicyA32283D9" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3Bucket4CA10A65": { "Type": "AWS::S3::Bucket", "Properties": { @@ -154,6 +218,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -202,12 +272,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3snsS3BucketAutoDeleteObjectsCustomResource43654954": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3Bucket4CA10A65" + } + }, + "DependsOn": [ + "tests3snsS3BucketPolicyA51165A8" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3BucketNotificationsFCF8E340": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -402,6 +530,82 @@ ] } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -499,6 +703,18 @@ { "id": "W92", "reason": "Impossible for us to define the correct concurrency for clients" + }, + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" } ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.ts index 7652faca9..2161b88a3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-noArguments.ts @@ -14,7 +14,7 @@ /// !cdk-integ * import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { S3ToSns } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { SuppressCfnNagLambdaWarnings, generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); @@ -22,7 +22,13 @@ const stack = new Stack(app, generateIntegStackName(__filename)); new S3ToSns(stack, 'test-s3-sns', { bucketProps: { removalPolicy: RemovalPolicy.DESTROY, - } + autoDeleteObjects: true, + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }, }); +SuppressCfnNagLambdaWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.expected.json index 618503467..4a9a81b2e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.expected.json @@ -18,6 +18,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -77,6 +83,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -118,6 +163,25 @@ } } }, + "tests3snsS3LoggingBucketAutoDeleteObjectsCustomResourceFEE6B95B": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + } + }, + "DependsOn": [ + "tests3snsS3LoggingBucketPolicyA32283D9" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3Bucket4CA10A65": { "Type": "AWS::S3::Bucket", "Properties": { @@ -154,6 +218,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -202,12 +272,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3snsS3BucketAutoDeleteObjectsCustomResource43654954": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3Bucket4CA10A65" + } + }, + "DependsOn": [ + "tests3snsS3BucketPolicyA51165A8" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3BucketNotificationsFCF8E340": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -416,6 +544,82 @@ ] } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -513,6 +717,18 @@ { "id": "W92", "reason": "Impossible for us to define the correct concurrency for clients" + }, + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" } ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.ts index 9f0252512..dbfc506b6 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-s3EventTypesAndFilters.ts @@ -14,7 +14,7 @@ /// !cdk-integ * import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { S3ToSns } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { SuppressCfnNagLambdaWarnings, generateIntegStackName } from '@aws-solutions-constructs/core'; import * as s3 from 'aws-cdk-lib/aws-s3'; const app = new App(); @@ -23,6 +23,11 @@ const stack = new Stack(app, generateIntegStackName(__filename)); new S3ToSns(stack, 'test-s3-sns', { bucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, }, s3EventTypes: [ s3.EventType.OBJECT_REMOVED @@ -35,4 +40,5 @@ new S3ToSns(stack, 'test-s3-sns', { ], }); +SuppressCfnNagLambdaWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.expected.json index f7f6e850d..63e25041f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.expected.json @@ -18,6 +18,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -77,6 +83,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3LoggingBucket94DE93BC", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -118,6 +163,25 @@ } } }, + "tests3snsS3LoggingBucketAutoDeleteObjectsCustomResourceFEE6B95B": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + } + }, + "DependsOn": [ + "tests3snsS3LoggingBucketPolicyA32283D9" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3Bucket4CA10A65": { "Type": "AWS::S3::Bucket", "Properties": { @@ -154,6 +218,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -202,12 +272,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3snsS3Bucket4CA10A65", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3snsS3BucketAutoDeleteObjectsCustomResource43654954": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3snsS3Bucket4CA10A65" + } + }, + "DependsOn": [ + "tests3snsS3BucketPolicyA51165A8" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3snsS3BucketNotificationsFCF8E340": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -369,6 +497,82 @@ ] } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3snsS3LoggingBucket94DE93BC" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -466,6 +670,18 @@ { "id": "W92", "reason": "Impossible for us to define the correct concurrency for clients" + }, + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" } ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.ts index f1dcd5594..9ede46628 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sns/test/integ.s3sns-snsTopicWithAwsManagedKey.ts @@ -14,7 +14,7 @@ /// !cdk-integ * import { App, Stack, RemovalPolicy } from "aws-cdk-lib"; import { S3ToSns } from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { SuppressCfnNagLambdaWarnings, generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); const stack = new Stack(app, generateIntegStackName(__filename)); @@ -22,8 +22,14 @@ const stack = new Stack(app, generateIntegStackName(__filename)); new S3ToSns(stack, 'test-s3-sns', { bucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, }, enableEncryptionWithCustomerManagedKey: false }); +SuppressCfnNagLambdaWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.expected.json index 34cf2729f..ea4889cfa 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.expected.json @@ -102,6 +102,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -160,12 +166,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3sqsS3BucketFF76CDA6", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3sqsS3BucketFF76CDA6", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3sqsS3BucketAutoDeleteObjectsCustomResource678AB073": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3sqsS3BucketFF76CDA6" + } + }, + "DependsOn": [ + "tests3sqsS3BucketPolicyA477877B" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3sqsS3BucketNotifications32539247": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -415,6 +479,82 @@ ] } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3sqsS3BucketFF76CDA6" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -512,6 +652,18 @@ { "id": "W92", "reason": "Impossible for us to define the correct concurrency for clients" + }, + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" } ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.ts index d4b632709..7708fd73b 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-creatingNewQueue.ts @@ -49,6 +49,7 @@ const props: S3ToSqsProps = { s3EventFilters: [filter], bucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, }, logS3AccessLogs: false }; @@ -61,5 +62,6 @@ defaults.addCfnSuppressRules(s3Bucket, [ reason: 'This S3 bucket is created for unit/ integration testing purposes only.' }, ]); +defaults.SuppressCfnNagLambdaWarnings(stack); // Synth app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json index 76a958692..34ec0ea7c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.expected.json @@ -12,7 +12,6 @@ } ] }, - "BucketName": "custom-logging-bucket", "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts index df3b22c36..e667e7085 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-customLoggingBucket.ts @@ -29,7 +29,6 @@ new S3ToSqs(stack, 'test-s3-sqs', { loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true, - bucketName: 'custom-logging-bucket', encryption: BucketEncryption.S3_MANAGED, versioned: true } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.expected.json index cd1ee5d07..b4b6cc110 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.expected.json @@ -212,6 +212,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -270,12 +276,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3sqsS3BucketFF76CDA6", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3sqsS3BucketFF76CDA6", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3sqsS3BucketAutoDeleteObjectsCustomResource678AB073": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3sqsS3BucketFF76CDA6" + } + }, + "DependsOn": [ + "tests3sqsS3BucketPolicyA477877B" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3sqsS3BucketNotifications32539247": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -310,6 +374,82 @@ "testexistingqueue42252242" ] }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3sqsS3BucketFF76CDA6" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -407,6 +547,18 @@ { "id": "W92", "reason": "Impossible for us to define the correct concurrency for clients" + }, + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" } ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.ts index b726a9c10..fceab059e 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-existingQueue.ts @@ -30,6 +30,7 @@ const props: S3ToSqsProps = { existingQueueObj: buildQueueResponse.queue, bucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, }, logS3AccessLogs: false }; @@ -42,4 +43,5 @@ defaults.addCfnSuppressRules(s3Bucket, [ reason: 'This S3 bucket is created for unit/ integration testing purposes only.' }, ]); +defaults.SuppressCfnNagLambdaWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.expected.json index 1fe822f96..40db564ef 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.expected.json @@ -18,6 +18,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -77,6 +83,45 @@ } ] }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3sqsS3LoggingBucket0B0BC86A", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3sqsS3LoggingBucket0B0BC86A", + "Arn" + ] + }, + "/*" + ] + ] + } + ] + }, { "Action": "s3:PutObject", "Condition": { @@ -118,6 +163,25 @@ } } }, + "tests3sqsS3LoggingBucketAutoDeleteObjectsCustomResource054A5A8A": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3sqsS3LoggingBucket0B0BC86A" + } + }, + "DependsOn": [ + "tests3sqsS3LoggingBucketPolicy3A15958C" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3sqsS3BucketFF76CDA6": { "Type": "AWS::S3::Bucket", "Properties": { @@ -154,6 +218,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -202,12 +272,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3sqsS3BucketFF76CDA6", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3sqsS3BucketFF76CDA6", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3sqsS3BucketAutoDeleteObjectsCustomResource678AB073": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3sqsS3BucketFF76CDA6" + } + }, + "DependsOn": [ + "tests3sqsS3BucketPolicyA477877B" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3sqsS3BucketNotifications32539247": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -511,6 +639,82 @@ ] } }, + "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" + } + ] + } + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "b7f33614a69548d6bafe224d751a7ef238cde19097415e553fe8b63a4c8fd8a6.zip" + }, + "Timeout": 900, + "MemorySize": 128, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + }, + "Runtime": "nodejs18.x", + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "tests3sqsS3LoggingBucket0B0BC86A" + }, + " S3 bucket." + ] + ] + } + }, + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" + ], + "Metadata": { + "cfn_nag": { + "rules_to_suppress": [ + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + } + ] + } + } + }, "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { "Type": "AWS::IAM::Role", "Properties": { @@ -608,6 +812,18 @@ { "id": "W92", "reason": "Impossible for us to define the correct concurrency for clients" + }, + { + "id": "W58", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W89", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" + }, + { + "id": "W92", + "reason": "This Lambda Function is created for integration testing purposes only and is not part of an actual construct" } ] } diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.ts b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.ts index 2af4344d2..6b2ff222f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-sqs/test/integ.s3sqs-noArguments.ts @@ -14,7 +14,7 @@ /// !cdk-integ * import {App, Stack, RemovalPolicy} from "aws-cdk-lib"; import {S3ToSqs} from "../lib"; -import { generateIntegStackName } from '@aws-solutions-constructs/core'; +import { SuppressCfnNagLambdaWarnings, generateIntegStackName } from '@aws-solutions-constructs/core'; const app = new App(); @@ -24,6 +24,12 @@ const stack = new Stack(app, generateIntegStackName(__filename)); new S3ToSqs(stack, 'test-s3-sqs', { bucketProps: { removalPolicy: RemovalPolicy.DESTROY, - } + autoDeleteObjects: true + }, + loggingBucketProps: { + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true + }, }); +SuppressCfnNagLambdaWarnings(stack); app.synth(); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json index 09e2dad25..bf5436dee 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.expected.json @@ -12,7 +12,6 @@ } ] }, - "BucketName": "custom-logging-bucket", "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -219,6 +218,12 @@ "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true" + } + ], "VersioningConfiguration": { "Status": "Enabled" } @@ -267,12 +272,70 @@ ] } ] + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn" + ] + } + }, + "Resource": [ + { + "Fn::GetAtt": [ + "tests3stepfunctionsS3Bucket2B08AD28", + "Arn" + ] + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "tests3stepfunctionsS3Bucket2B08AD28", + "Arn" + ] + }, + "/*" + ] + ] + } + ] } ], "Version": "2012-10-17" } } }, + "tests3stepfunctionsS3BucketAutoDeleteObjectsCustomResource8EC73828": { + "Type": "Custom::S3AutoDeleteObjects", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn" + ] + }, + "BucketName": { + "Ref": "tests3stepfunctionsS3Bucket2B08AD28" + } + }, + "DependsOn": [ + "tests3stepfunctionsS3BucketPolicy816CD289" + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, "tests3stepfunctionsS3BucketNotificationsDBB3D484": { "Type": "Custom::S3BucketNotifications", "Properties": { @@ -294,7 +357,27 @@ "tests3stepfunctionstests3stepfunctionseventrulestepfunctionconstructStateMachineLogGroupB4555776": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "with-lambda" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/s3stp-customLoggingBuckettest-s3-stepfunctions-event-rule-step-function-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts index c3f85b225..5387cef3f 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-customLoggingBucket.ts @@ -31,17 +31,16 @@ new S3ToStepfunctions(stack, 'test-s3-stepfunctions', { }, bucketProps: { removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, }, loggingBucketProps: { removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true, - bucketName: 'custom-logging-bucket', encryption: BucketEncryption.S3_MANAGED, versioned: true }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "with-lambda" } }); diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.expected.json b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.expected.json index eea751b3e..f4bd0c6d3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.expected.json @@ -313,7 +313,27 @@ "tests3stepfunctionspreexistingbucketconstructtests3stepfunctionspreexistingbucketconstructeventrulestepfunctionconstructStateMachineLogGroup9D5E3E4D": { "Type": "AWS::Logs::LogGroup", "Properties": { - "LogGroupName": "with-lambda" + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/vendedlogs/states/constructs/s3stp-pre-existing-buckettest-s3-stepfunctions-pre-existing-bucket-construct-event-rule-step-function-constructStateMachineLog-", + { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Ref": "AWS::StackId" + } + ] + } + ] + } + ] + ] + } }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", diff --git a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.ts b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.ts index 676679b09..b87f81680 100644 --- a/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.ts +++ b/source/patterns/@aws-solutions-constructs/aws-s3-stepfunctions/test/integ.s3stp-pre-existing-bucket.ts @@ -34,7 +34,6 @@ const props: S3ToStepfunctionsProps = { }, logGroupProps: { removalPolicy: RemovalPolicy.DESTROY, - logGroupName: "with-lambda" }, logS3AccessLogs: false }; From f772200d6885cf0e0030239ce6f7511cdb2814d6 Mon Sep 17 00:00:00 2001 From: Shuya Kinjo Date: Thu, 23 Nov 2023 06:05:12 +0900 Subject: [PATCH 71/73] fix(aws-apigateway-sqs): Remove /message path when delete method is not allowed (#1030) * Fix remove unnecessary message path * Update integration test expected results * Fix lint issues --- .../aws-apigateway-sqs/lib/index.ts | 4 +- .../test/apigateway-sqs.test.ts | 25 ++++++++ ...additional-request-templates.expected.json | 20 +----- ...g.apisqs-apigateway-sqs-crud.expected.json | 62 +++++++++---------- ...custom-integration-responses.expected.json | 22 +------ .../integ.apisqs-existing-queue.expected.json | 22 +------ .../integ.apisqs-no-arguments.expected.json | 22 +------ 7 files changed, 68 insertions(+), 109 deletions(-) diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts index b97e9198d..afd0be495 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/lib/index.ts @@ -241,9 +241,6 @@ export class ApiGatewayToSqs extends Construct { assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com') }); - // Setup the API Gateway resource - const apiGatewayResource = this.apiGateway.root.addResource('message'); - // Create const createRequestTemplate = props.createRequestTemplate ?? this.defaultCreateRequestTemplate; if (props.allowCreateOperation && props.allowCreateOperation === true) { @@ -281,6 +278,7 @@ export class ApiGatewayToSqs extends Construct { // Delete const deleteRequestTemplate = props.deleteRequestTemplate ?? this.defaultDeleteRequestTemplate; if (props.allowDeleteOperation && props.allowDeleteOperation === true) { + const apiGatewayResource = this.apiGateway.root.addResource('message'); this.addActionToPolicy("sqs:DeleteMessage"); defaults.addProxyMethodToApiResource({ service: "sqs", diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts index 83b3907ad..685a3f02c 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/apigateway-sqs.test.ts @@ -163,6 +163,31 @@ test('Test deployment for override ApiGateway deleteRequestTemplate', () => { }); }); +test('Test deployment for disallow delete operation', () => { + const stack = new Stack(); + + new ApiGatewayToSqs(stack, 'api-gateway-sqs', { + allowDeleteOperation: false + }); + const template = Template.fromStack(stack); + const resources = template.findResources('AWS::ApiGateway::Resource', { + PathPart: "message" + }); + expect(Object.keys(resources).length).toBe(0); +}); + +test('Test deployment for allow delete operation', () => { + const stack = new Stack(); + + new ApiGatewayToSqs(stack, 'api-gateway-sqs', { + allowDeleteOperation: true + }); + const template = Template.fromStack(stack); + template.hasResourceProperties('AWS::ApiGateway::Resource', { + PathPart: "message" + }); +}); + test('Test deployment with existing queue object', () => { const stack = new Stack(); diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-additional-request-templates.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-additional-request-templates.expected.json index f871d7bf2..b5d14aeb2 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-additional-request-templates.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-additional-request-templates.expected.json @@ -198,7 +198,7 @@ "Name": "RestApi" } }, - "testapigatewaysqsdefaultRestApiDeploymentFB9688F5aa398c65c945d66dd485b50d59cc7a25": { + "testapigatewaysqsdefaultRestApiDeploymentFB9688F5ba8a42d07caa9db068377b2cabf4da74": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "Description": "Automatically created by the RestApi construct", @@ -208,7 +208,6 @@ }, "DependsOn": [ "testapigatewaysqsdefaultRestApiGET733E6394", - "testapigatewaysqsdefaultRestApimessage41073D7F", "testapigatewaysqsdefaultRestApiPOSTD8ACD1CB" ], "Metadata": { @@ -235,7 +234,7 @@ "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" }, "DeploymentId": { - "Ref": "testapigatewaysqsdefaultRestApiDeploymentFB9688F5aa398c65c945d66dd485b50d59cc7a25" + "Ref": "testapigatewaysqsdefaultRestApiDeploymentFB9688F5ba8a42d07caa9db068377b2cabf4da74" }, "MethodSettings": [ { @@ -252,21 +251,6 @@ "TracingEnabled": true } }, - "testapigatewaysqsdefaultRestApimessage41073D7F": { - "Type": "AWS::ApiGateway::Resource", - "Properties": { - "ParentId": { - "Fn::GetAtt": [ - "testapigatewaysqsdefaultRestApi554243C3", - "RootResourceId" - ] - }, - "PathPart": "message", - "RestApiId": { - "Ref": "testapigatewaysqsdefaultRestApi554243C3" - } - } - }, "testapigatewaysqsdefaultRestApiPOSTD8ACD1CB": { "Type": "AWS::ApiGateway::Method", "Properties": { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.expected.json index 1b5fd0c33..3360616f3 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-apigateway-sqs-crud.expected.json @@ -198,7 +198,7 @@ "Name": "RestApi" } }, - "testapigatewaysqsRestApiDeploymentCA19D3723284170350125cf6cf25e30c33a57efd": { + "testapigatewaysqsRestApiDeploymentCA19D37261367bad52ebfa5cbc65d48442b36029": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "Description": "Automatically created by the RestApi construct", @@ -236,7 +236,7 @@ "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" }, "DeploymentId": { - "Ref": "testapigatewaysqsRestApiDeploymentCA19D3723284170350125cf6cf25e30c33a57efd" + "Ref": "testapigatewaysqsRestApiDeploymentCA19D37261367bad52ebfa5cbc65d48442b36029" }, "MethodSettings": [ { @@ -253,26 +253,11 @@ "TracingEnabled": true } }, - "testapigatewaysqsRestApimessage6D62B7B0": { - "Type": "AWS::ApiGateway::Resource", - "Properties": { - "ParentId": { - "Fn::GetAtt": [ - "testapigatewaysqsRestApi557C7EDC", - "RootResourceId" - ] - }, - "PathPart": "message", - "RestApiId": { - "Ref": "testapigatewaysqsRestApi557C7EDC" - } - } - }, - "testapigatewaysqsRestApimessageDELETE2D4539B7": { + "testapigatewaysqsRestApiPOST26D15DBA": { "Type": "AWS::ApiGateway::Method", "Properties": { "AuthorizationType": "AWS_IAM", - "HttpMethod": "DELETE", + "HttpMethod": "POST", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -298,7 +283,7 @@ "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'" }, "RequestTemplates": { - "application/json": "Action=DeleteMessage&ReceiptHandle=$util.urlEncode($input.params('receiptHandle'))" + "application/json": "Action=SendMessage&MessageBody=$util.urlEncode(\"$input.body\")" }, "Type": "AWS", "Uri": { @@ -343,18 +328,21 @@ } ], "ResourceId": { - "Ref": "testapigatewaysqsRestApimessage6D62B7B0" + "Fn::GetAtt": [ + "testapigatewaysqsRestApi557C7EDC", + "RootResourceId" + ] }, "RestApiId": { "Ref": "testapigatewaysqsRestApi557C7EDC" } } }, - "testapigatewaysqsRestApiPOST26D15DBA": { + "testapigatewaysqsRestApiGET4AA265C9": { "Type": "AWS::ApiGateway::Method", "Properties": { "AuthorizationType": "AWS_IAM", - "HttpMethod": "POST", + "HttpMethod": "GET", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -380,7 +368,7 @@ "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'" }, "RequestTemplates": { - "application/json": "Action=SendMessage&MessageBody=$util.urlEncode(\"$input.body\")" + "application/json": "Action=ReceiveMessage" }, "Type": "AWS", "Uri": { @@ -435,11 +423,26 @@ } } }, - "testapigatewaysqsRestApiGET4AA265C9": { + "testapigatewaysqsRestApimessage6D62B7B0": { + "Type": "AWS::ApiGateway::Resource", + "Properties": { + "ParentId": { + "Fn::GetAtt": [ + "testapigatewaysqsRestApi557C7EDC", + "RootResourceId" + ] + }, + "PathPart": "message", + "RestApiId": { + "Ref": "testapigatewaysqsRestApi557C7EDC" + } + } + }, + "testapigatewaysqsRestApimessageDELETE2D4539B7": { "Type": "AWS::ApiGateway::Method", "Properties": { "AuthorizationType": "AWS_IAM", - "HttpMethod": "GET", + "HttpMethod": "DELETE", "Integration": { "Credentials": { "Fn::GetAtt": [ @@ -465,7 +468,7 @@ "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'" }, "RequestTemplates": { - "application/json": "Action=ReceiveMessage" + "application/json": "Action=DeleteMessage&ReceiptHandle=$util.urlEncode($input.params('receiptHandle'))" }, "Type": "AWS", "Uri": { @@ -510,10 +513,7 @@ } ], "ResourceId": { - "Fn::GetAtt": [ - "testapigatewaysqsRestApi557C7EDC", - "RootResourceId" - ] + "Ref": "testapigatewaysqsRestApimessage6D62B7B0" }, "RestApiId": { "Ref": "testapigatewaysqsRestApi557C7EDC" diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-custom-integration-responses.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-custom-integration-responses.expected.json index 10ff3fd83..ab06d6b13 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-custom-integration-responses.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-custom-integration-responses.expected.json @@ -198,7 +198,7 @@ "Name": "RestApi" } }, - "testapigatewaysqsintegrationresponsesRestApiDeployment9749223507b4327bc896117bc13d1c395d6fa5e7": { + "testapigatewaysqsintegrationresponsesRestApiDeployment9749223547b7cf1e61211d0a1959e7fc8dd7abd0": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "Description": "Automatically created by the RestApi construct", @@ -207,8 +207,7 @@ } }, "DependsOn": [ - "testapigatewaysqsintegrationresponsesRestApiGETD105D1F1", - "testapigatewaysqsintegrationresponsesRestApimessageC29A9FEB" + "testapigatewaysqsintegrationresponsesRestApiGETD105D1F1" ], "Metadata": { "cfn_nag": { @@ -234,7 +233,7 @@ "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" }, "DeploymentId": { - "Ref": "testapigatewaysqsintegrationresponsesRestApiDeployment9749223507b4327bc896117bc13d1c395d6fa5e7" + "Ref": "testapigatewaysqsintegrationresponsesRestApiDeployment9749223547b7cf1e61211d0a1959e7fc8dd7abd0" }, "MethodSettings": [ { @@ -251,21 +250,6 @@ "TracingEnabled": true } }, - "testapigatewaysqsintegrationresponsesRestApimessageC29A9FEB": { - "Type": "AWS::ApiGateway::Resource", - "Properties": { - "ParentId": { - "Fn::GetAtt": [ - "testapigatewaysqsintegrationresponsesRestApi3BE7E402", - "RootResourceId" - ] - }, - "PathPart": "message", - "RestApiId": { - "Ref": "testapigatewaysqsintegrationresponsesRestApi3BE7E402" - } - } - }, "testapigatewaysqsintegrationresponsesRestApiGETD105D1F1": { "Type": "AWS::ApiGateway::Method", "Properties": { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-existing-queue.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-existing-queue.expected.json index 95af50d20..849318566 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-existing-queue.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-existing-queue.expected.json @@ -110,7 +110,7 @@ "Name": "RestApi" } }, - "testapigatewaysqsexistingqueueRestApiDeploymentA3CB681F40a3b61200f0070439f29a9d27e30e73": { + "testapigatewaysqsexistingqueueRestApiDeploymentA3CB681Fb34af53058b656b91c9af037460db593": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "Description": "Automatically created by the RestApi construct", @@ -119,8 +119,7 @@ } }, "DependsOn": [ - "testapigatewaysqsexistingqueueRestApiGET860786F8", - "testapigatewaysqsexistingqueueRestApimessageDF0AE465" + "testapigatewaysqsexistingqueueRestApiGET860786F8" ], "Metadata": { "cfn_nag": { @@ -146,7 +145,7 @@ "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" }, "DeploymentId": { - "Ref": "testapigatewaysqsexistingqueueRestApiDeploymentA3CB681F40a3b61200f0070439f29a9d27e30e73" + "Ref": "testapigatewaysqsexistingqueueRestApiDeploymentA3CB681Fb34af53058b656b91c9af037460db593" }, "MethodSettings": [ { @@ -163,21 +162,6 @@ "TracingEnabled": true } }, - "testapigatewaysqsexistingqueueRestApimessageDF0AE465": { - "Type": "AWS::ApiGateway::Resource", - "Properties": { - "ParentId": { - "Fn::GetAtt": [ - "testapigatewaysqsexistingqueueRestApi2E025EF5", - "RootResourceId" - ] - }, - "PathPart": "message", - "RestApiId": { - "Ref": "testapigatewaysqsexistingqueueRestApi2E025EF5" - } - } - }, "testapigatewaysqsexistingqueueRestApiGET860786F8": { "Type": "AWS::ApiGateway::Method", "Properties": { diff --git a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-no-arguments.expected.json b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-no-arguments.expected.json index 569e49fc9..04592a0fe 100644 --- a/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-no-arguments.expected.json +++ b/source/patterns/@aws-solutions-constructs/aws-apigateway-sqs/test/integ.apisqs-no-arguments.expected.json @@ -198,7 +198,7 @@ "Name": "RestApi" } }, - "testapigatewaysqsdefaultRestApiDeploymentFB9688F5638eca4a0d71dff702d4b2c6b1d1e2df": { + "testapigatewaysqsdefaultRestApiDeploymentFB9688F5fb9a1a72439389c4d385b8e23725ff77": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "Description": "Automatically created by the RestApi construct", @@ -207,8 +207,7 @@ } }, "DependsOn": [ - "testapigatewaysqsdefaultRestApiGET733E6394", - "testapigatewaysqsdefaultRestApimessage41073D7F" + "testapigatewaysqsdefaultRestApiGET733E6394" ], "Metadata": { "cfn_nag": { @@ -234,7 +233,7 @@ "Format": "{\"requestId\":\"$context.requestId\",\"ip\":\"$context.identity.sourceIp\",\"user\":\"$context.identity.user\",\"caller\":\"$context.identity.caller\",\"requestTime\":\"$context.requestTime\",\"httpMethod\":\"$context.httpMethod\",\"resourcePath\":\"$context.resourcePath\",\"status\":\"$context.status\",\"protocol\":\"$context.protocol\",\"responseLength\":\"$context.responseLength\"}" }, "DeploymentId": { - "Ref": "testapigatewaysqsdefaultRestApiDeploymentFB9688F5638eca4a0d71dff702d4b2c6b1d1e2df" + "Ref": "testapigatewaysqsdefaultRestApiDeploymentFB9688F5fb9a1a72439389c4d385b8e23725ff77" }, "MethodSettings": [ { @@ -251,21 +250,6 @@ "TracingEnabled": true } }, - "testapigatewaysqsdefaultRestApimessage41073D7F": { - "Type": "AWS::ApiGateway::Resource", - "Properties": { - "ParentId": { - "Fn::GetAtt": [ - "testapigatewaysqsdefaultRestApi554243C3", - "RootResourceId" - ] - }, - "PathPart": "message", - "RestApiId": { - "Ref": "testapigatewaysqsdefaultRestApi554243C3" - } - } - }, "testapigatewaysqsdefaultRestApiGET733E6394": { "Type": "AWS::ApiGateway::Method", "Properties": { From 870a3cfe5a48ccc5b55c43b572c134a358f1a856 Mon Sep 17 00:00:00 2001 From: AWS Solutions Constructs Automation Date: Mon, 27 Nov 2023 18:56:26 +0000 Subject: [PATCH 72/73] chore(release): 2.47.0 --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ source/lerna.json | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9bf148ff..4f76fac7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,39 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.47.0](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/compare/v2.14.0...v2.47.0) (2023-11-27) + + +### Features + +* **aws-apigateway-*:** add optional request templates for non-default content-types. ([#888](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/888)) ([ace70f0](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/ace70f0ff9efed0cd1cdf46cabd8fa2e9f0e1bcc)) +* **aws-apigateway-dynamodb:** add optional resourceName parameter ([#898](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/898)) ([09e54ec](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/09e54ec2150257be3e2c1cb1aa42124aa4e8f55e)) +* **aws-dynamodbstreams-lambda-elasticsearch-kibana:** Added VPC support ([#816](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/816)) ([30a5160](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/30a5160ce3165fa838e571fabb0d31c13961bb8f)) +* **aws-iot-lambda-dynamodb:** add vpc and environment variable name to construct interface ([#894](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/894)) ([8ee687a](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/8ee687a8d644be8c7db8f905a55e5fced5a70bfc)) +* **aws-lambda-kinesisstream:** created new construct ([#873](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/873)) ([81592de](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/81592de3b14a9d6f01a7e61519be6c6b90695cff)) +* **aws-lambda-opensearch:** created new construct ([#818](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/818)) ([f31f59d](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/f31f59d1ce4d945508f999d58905b1775f26a891)) +* **aws-openapi-lambda:** make names unique ([#987](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/987)) ([be9997a](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/be9997a4e7e376670ef7f3d8bf1335ea3cebc515)) +* **aws-wafwebacl-agigateway:** enable govcloud ([#900](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/900)) ([dd19d93](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/dd19d9363fa6c33b0c616a1a5392c26369bc02b2)) +* **aws-wafwebacl-appsync:** created new construct ([#833](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/833)) ([1c708b9](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/1c708b9bb2527ba2cbec974eab3a0e272ad26ad4)) +* **new construct:** aws-fargate-kinesisfirehose ([#881](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/881)) ([3a74a27](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/3a74a27f9c3e895a44b485ee1bb8fe9adc50a80e)) +* **new construct:** aws-fargate-kinesisstreams ([#877](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/877)) ([08b7975](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/08b79756743e4a3f9930128e8318670666e01367)), closes [#875](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/875) +* **new construct:** aws-lambda-kendra ([#989](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/989)) ([24fe018](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/24fe018898dafd4be2d20d6636ad54333da4145d)) +* **new construct:** aws-lambda-kinesisfirehose ([#875](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/875)) ([aef3efa](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/aef3efab4b4658f12ed82937683d08997162d9bc)) +* **new construct:** aws-openapigateway-lambda ([#912](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/912)) ([09465d6](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/09465d65fc5969da5691cf5057c278ded8753b43)), closes [#910](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/910) [#917](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/917) [#922](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/922) [#929](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/929) [#930](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/930) + + +### Bug Fixes + +* **all constructs:** use aws.partition where value could refer to govcloud ([#941](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/941)) ([e4cc3c0](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/e4cc3c090d669a8f163adb013c26fcd3796b5d8b)) +* **all:** typos ([#1010](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/1010)) ([0787baf](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/0787baf7c68f84599139e5b886d5942b076174f2)) +* **aws-alb-fargate:** change container used to launch integ tests ([#962](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/962)) ([30ba7d9](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/30ba7d94a3cdd3766c24af49dbf66e56053b7b41)) +* **aws-apigateway-sqs:** Remove /message path when delete method is not allowed ([#1030](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/1030)) ([f772200](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/f772200d6885cf0e0030239ce6f7511cdb2814d6)) +* **aws-eventbridge-sns:** long sns topic names break eventbridge bindings ([#1024](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/1024)) ([9da7065](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/9da706586cf6cceb9bf4eba3cb9332003af195e0)) +* **readme.md files:** update all documentation links to v2 ([#815](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/815)) ([ad1f9d7](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/ad1f9d77ad956f6a139adceec1891132996611ee)) +* **s3-bucket-helper:** not populating response.loggingBucket when bucket supplied ([#934](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/934)) ([b65986d](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/b65986d7d1791c2ed19e62c8f39ffe42b6f2a274)) +* **s3-constructs:** accommodate s3 change that disables acls by default ([#949](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/949)) ([46d02cc](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/46d02ccf98e368206b59c27a16003dc3b16d4236)) +* **StepFunctions:** Address LogGroup behavior problems ([#922](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/issues/922)) ([84e581c](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/commit/84e581cad10f59daf827fb6e8f8101e1ec6b11f3)) + ## [2.46.0](https://github.com/awslabs/aws-solutions-constructs/compare/v2.45.0...v2.46.0) (2023-11-09) Built on CDK v2.105.0 diff --git a/source/lerna.json b/source/lerna.json index 9c5ad553a..c89f6b0b0 100644 --- a/source/lerna.json +++ b/source/lerna.json @@ -6,5 +6,5 @@ "./patterns/@aws-solutions-constructs/*" ], "rejectCycles": "true", - "version": "2.46.0" + "version": "2.47.0" } From 544affe494e6d68b8606ad8cda931c0ed391b525 Mon Sep 17 00:00:00 2001 From: biffgaut Date: Mon, 27 Nov 2023 13:57:53 -0500 Subject: [PATCH 73/73] chore(changelog): Updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f76fac7b..7b3522906 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file. See [standa ## [2.47.0](https://github.com/aws-solutions-constructs-team/aws-solutions-constructs-test/compare/v2.14.0...v2.47.0) (2023-11-27) +Test Release ### Features